package net.sf.eclipsefp.haskell.ui.internal.editors.haskell.codeassist; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import net.sf.eclipsefp.haskell.browser.items.Declaration; import net.sf.eclipsefp.haskell.browser.items.DeclarationType; import net.sf.eclipsefp.haskell.browser.items.Documented; import net.sf.eclipsefp.haskell.core.util.ResourceUtil; import net.sf.eclipsefp.haskell.ui.HaskellUIPlugin; import net.sf.eclipsefp.haskell.ui.internal.editors.haskell.imports.ImportsManager; import net.sf.eclipsefp.haskell.ui.internal.util.UITexts; import net.sf.eclipsefp.haskell.util.FileUtil; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.templates.DocumentTemplateContext; import org.eclipse.jface.text.templates.TemplateContext; import org.eclipse.jface.text.templates.TemplateVariable; import org.eclipse.jface.text.templates.TemplateVariableResolver; public class HsTypeNameTemplateVariable extends TemplateVariableResolver { /** The template variable name */ private static final String NAME = "typeName"; /** Associated Scion-server instance, if supplied. */ // private final ScionInstance scion; public HsTypeNameTemplateVariable() { super( NAME, UITexts.HaskellTemplateVariables_typeName_description ); // scion = null; } // public HsTypeNameTemplateVariable( final String type, final String description ) { // super( type, description ); // scion = null; // } /** * {@inheritDoc} */ @Override public void resolve( final TemplateVariable variable, final TemplateContext context ) { if( context instanceof DocumentTemplateContext ) { DocumentTemplateContext docContext = ( DocumentTemplateContext )context; IDocument doc = docContext.getDocument(); Assert.isNotNull( doc ); IFile file = HaskellUIPlugin.getFile( doc ); if( file != null ) { Assert.isTrue( FileUtil.hasHaskellExtension( file ) ); Assert.isTrue( ResourceUtil.isInHaskellProject( file ) ); // final ScionInstance si = getScionInstance( file ); // // Assert.isNotNull( si ); // // Map<String, String> completions = si.completionsForTypes( file, doc ); // // if (completions != null) { // List<String> keys = new ArrayList<String>( completions.keySet() ); // // Collections.sort(keys); // variable.setValues( keys.toArray( new String[keys.size()] ) ); // } else { // variable.setValue( new String() ); // variable.setResolved( false ); // } ImportsManager mgr = new ImportsManager( file, doc ); Map<String, Documented> decls = mgr.getDeclarations(); List<String> keys = new ArrayList<>(); for ( String s : decls.keySet() ) { Documented d = decls.get( s ); if (d instanceof Declaration){ if (DeclarationType.TYPE_SYNONYM.equals(((Declaration)d).getType()) || DeclarationType.NEW_TYPE.equals(((Declaration)d).getType()) || DeclarationType.DATA_TYPE.equals(((Declaration)d).getType())){ keys.add(s); } } } Collections.sort(keys); variable.setValues( keys.toArray( new String[keys.size()] ) ); } else { variable.setValue( new String() ); } } else { variable.setValue( new String() ); } variable.setResolved( true ); } /** scion-server instance accessor */ // private final ScionInstance getScionInstance(final IFile file) { // return (scion == null ? ScionPlugin.getScionInstance( file ) : scion); // } }