package com.redhat.ceylon.eclipse.code.correct;
import static com.redhat.ceylon.eclipse.code.correct.ImportProposals.importProposals;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.link.ILinkedModeListener;
import org.eclipse.jface.text.link.LinkedModeModel;
import org.eclipse.swt.widgets.Display;
import com.redhat.ceylon.compiler.typechecker.tree.Tree;
import com.redhat.ceylon.eclipse.code.editor.CeylonEditor;
import com.redhat.ceylon.eclipse.platform.platformJ2C;
import com.redhat.ceylon.ide.common.platform.TextChange;
import com.redhat.ceylon.model.typechecker.model.Declaration;
import com.redhat.ceylon.model.typechecker.model.Type;
import ceylon.interop.java.CeylonMutableSet;
public class LinkedModeImporter implements ILinkedModeListener {
public static final int CANCEL = 1 << 10;
private Type type;
private IDocument document;
private CeylonEditor editor;
public LinkedModeImporter(IDocument document,
CeylonEditor editor) {
this.document = document;
this.editor = editor;
}
@Override
public void left(LinkedModeModel model, int flags) {
if (type!=null && (flags&CANCEL)==0) {
Display.getCurrent()
.syncExec(new Runnable() {
@Override
public void run() {
Set<Declaration> imports =
new HashSet<Declaration>();
//note: we want the very latest tree here, so
//get it direct from the editor!
Tree.CompilationUnit rootNode =
editor.getParseController()
.getLastCompilationUnit();
importProposals()
.importType(
new CeylonMutableSet<>(null, imports),
type, rootNode);
if (!imports.isEmpty()) {
TextChange change = new platformJ2C().newChange("Import Type",
document);
change.initMultiEdit();
importProposals()
.applyImports(change,
new CeylonMutableSet<>(null, imports),
rootNode, change.getDocument());
change.apply();
}
}
});
}
}
@Override
public void suspend(LinkedModeModel model) {}
@Override
public void resume(LinkedModeModel model, int flags) {}
public void selected(Type type) {
this.type = type;
}
}