// Copyright (c) 2003-2005 by Leif Frenzel - see http://leiffrenzel.de
package net.sf.eclipsefp.haskell.ghccompiler.core;
import java.util.ArrayList;
import java.util.List;
import net.sf.eclipsefp.haskell.ghccompiler.GhcCompilerPlugin;
import net.sf.eclipsefp.haskell.ghccompiler.core.preferences.IGhcPreferenceNames;
import org.eclipse.core.runtime.Platform;
/** <p>a helper that constructs compiler parameters from the current settings
* in the preferences.</p>
*
* @author Leif Frenzel
*/
public class CompilerParams implements IGhcPreferenceNames{
public CompilerParams() {
super();
}
public List<String> construct(final String version) {
List<String> result = new ArrayList<>();
addOptimizationLevel( result );
/* addLanguageParams( result );
addOptimizationParams( result );
addMoreOptimizationParams( result );*/
for (GhcParameter p:GhcParameter.values()){
if (GhcParameterType.LANGUAGE.equals( p.getType() ) ||GhcParameterType.OPTIMIZATION_SPECIFIC.equals( p.getType() )){
addBooleanParam( p, result,version );
}
}
addExtraOptions( result );
return result;
}
// helping methods
//////////////////
/* private void addLanguageParams( final List<String> result ) {
// boolean preferences use the parameter as key
addBooleanParam( LANG_GLASGOW_EXTS, result );
addBooleanParam( LANG_FI, result );
addBooleanParam( LANG_FFI, result );
addBooleanParam( LANG_WITH, result );
addBooleanParam( LANG_NO_MONOMORPHISM_RESTRICTION, result );
addBooleanParam( LANG_ALLOW_OVERLAPPING_INSTANCES, result );
addBooleanParam( LANG_ALLOW_UNDECIDABLE_INSTANCES, result );
addBooleanParam( LANG_ALLOW_INCOHERENT_INSTANCES, result );
addBooleanParam( LANG_GENERICS, result );
addBooleanParam( LANG_NO_IMPLICIT_PRELUDE, result );
}
private void addOptimizationParams( final List<String> result ) {
// boolean preferences use the parameter as key
addBooleanParam( OPT_EXCESS_PRECISION, result );
addBooleanParam( OPT_IGNORE_ASSERTS, result );
addBooleanParam( OPT_NO_STRICTNESS, result );
addBooleanParam( OPT_NO_CPR, result );
addBooleanParam( OPT_UNBOX_STRICT_FIELDS, result );
}
private void addMoreOptimizationParams( final List<String> result ) {
// boolean preferences use the parameter as key
addBooleanParam( OPT_CASE_MERGE, result );
addBooleanParam( OPT_DICTS_STRICT, result );
addBooleanParam( OPT_DO_ETA_REDUCTION, result );
addBooleanParam( OPT_DO_LAMBDA_ETA_EXPANSION, result );
addBooleanParam( OPT_FOLDR_BUILD_ON, result );
addBooleanParam( OPT_IGNORE_INTERFACE_PRAGMAS, result );
addBooleanParam( OPT_LET_NO_ESCAPE, result );
addBooleanParam( OPT_OMIT_INTERFACE_PRAGMAS, result );
addBooleanParam( OPT_NO_CSE, result );
addBooleanParam( OPT_NO_PRE_INLINING, result );
addBooleanParam( OPT_NUMBERS_STRICT, result );
addBooleanParam( OPT_USAGESP, result );
}*/
private void addExtraOptions( final List<String> list ) {
if( Platform.getPreferencesService().getBoolean( GhcCompilerPlugin.getPluginId(), USE_EXTRA_OPTIONS, false, null ) ) {
String extras = Platform.getPreferencesService().getString( GhcCompilerPlugin.getPluginId(), EXTRA_OPTIONS, null, null );
if( extras != null && !extras.trim().equals( "" ) ) { //$NON-NLS-1$
list.add( extras );
}
}
}
private void addBooleanParam( final GhcParameter p, final List<String> list,final String version ) {
boolean value = Platform.getPreferencesService().getBoolean( GhcCompilerPlugin.getPluginId(), p.getName(), false, null );
if( value ) {
list.add( p.getName(version) );
}
}
private void addOptimizationLevel( final List<String> list ) {
int level = Platform.getPreferencesService().getInt( GhcCompilerPlugin.getPluginId(), OPTIMIZATION_LEVEL, 0, null );
if( level > -1 ) {
String optLevel = "-O" + String.valueOf( level ); //$NON-NLS-1$
list.add( optLevel );
}
}
}