package com.redhat.ceylon.eclipse.code.correct;
import static com.redhat.ceylon.compiler.typechecker.tree.TreeUtil.formatPath;
import static com.redhat.ceylon.eclipse.java2ceylon.Java2CeylonProxies.importsJ2C;
import static com.redhat.ceylon.eclipse.ui.CeylonResources.IMPORT;
import static com.redhat.ceylon.eclipse.util.ModuleQueries.getModuleQuery;
import java.util.Collection;
import java.util.List;
import java.util.TreeSet;
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.contentassist.ICompletionProposalExtension6;
import org.eclipse.jface.text.contentassist.IContextInformation;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import com.redhat.ceylon.cmr.api.ModuleQuery;
import com.redhat.ceylon.cmr.api.ModuleSearchResult;
import com.redhat.ceylon.cmr.api.ModuleSearchResult.ModuleDetails;
import com.redhat.ceylon.common.Versions;
import com.redhat.ceylon.compiler.typechecker.TypeChecker;
import com.redhat.ceylon.compiler.typechecker.tree.Node;
import com.redhat.ceylon.compiler.typechecker.tree.Tree;
import com.redhat.ceylon.eclipse.util.Highlights;
import com.redhat.ceylon.model.cmr.JDKUtils;
import com.redhat.ceylon.model.typechecker.model.Module;
import com.redhat.ceylon.model.typechecker.model.Unit;
@Deprecated
class AddModuleImportProposal
implements ICompletionProposal,
ICompletionProposalExtension6 {
private final IProject project;
private final Unit unit;
private final String name;
private final String version;
AddModuleImportProposal(IProject project, Unit unit,
ModuleDetails details) {
this.project = project;
this.unit = unit;
this.name = details.getName();
this.version = details.getLastVersion().getVersion();
}
AddModuleImportProposal(IProject project, Unit unit,
String name, String version) {
this.project = project;
this.unit = unit;
this.name = name;
this.version = version;
}
@Override
public void apply(IDocument document) {
importsJ2C().importUtil().addModuleImport(project,
unit.getPackage().getModule(),
name, version);
}
@Override
public Point getSelection(IDocument document) {
return null;
}
@Override
public String getAdditionalProposalInfo() {
return null;
}
@Override
public String getDisplayString() {
return "Add 'import " + name + " \"" + version + "\"' to module descriptor";
}
@Override
public Image getImage() {
return IMPORT;
}
@Override
public IContextInformation getContextInformation() {
return null;
}
@Override
public StyledString getStyledDisplayString() {
return Highlights.styleProposal(getDisplayString(), true);
}
static void addModuleImportProposals(
final Collection<ICompletionProposal> proposals,
final IProject project,
final TypeChecker typeChecker, Node node) {
final Unit unit = node.getUnit();
if (unit.getPackage().getModule().isDefault()) {
return;
}
if (node instanceof Tree.Import) {
Tree.Import i = (Tree.Import) node;
node = i.getImportPath();
}
Tree.ImportPath ip = (Tree.ImportPath) node;
List<Tree.Identifier> ids = ip.getIdentifiers();
final String pkg = formatPath(ids);
if (JDKUtils.isJDKAnyPackage(pkg)) {
TreeSet<String> moduleNames =
new TreeSet<String>
(JDKUtils.getJDKModuleNames());
for (String mod: moduleNames) {
if (JDKUtils.isJDKPackage(mod, pkg)) {
proposals.add(new AddModuleImportProposal(
project, unit, mod,
JDKUtils.jdk.version));
return;
}
}
}
Module module = unit.getPackage().getModule();
ModuleQuery query =
getModuleQuery("", module, project);
query.setMemberName(pkg);
query.setMemberSearchPackageOnly(true);
query.setMemberSearchExact(true);
query.setCount(10l);
query.setJvmBinaryMajor(Versions.JVM_BINARY_MAJOR_VERSION);
query.setJvmBinaryMinor(Versions.JVM_BINARY_MINOR_VERSION);
query.setJsBinaryMajor(Versions.JS_BINARY_MAJOR_VERSION);
query.setJsBinaryMinor(Versions.JS_BINARY_MINOR_VERSION);
ModuleSearchResult msr =
typeChecker
.getContext()
.getRepositoryManager()
.searchModules(query);
for (ModuleDetails md: msr.getResults()) {
proposals.add(new AddModuleImportProposal(
project, unit, md));
}
/*class Runnable implements IRunnableWithProgress {
@Override
public void run(IProgressMonitor monitor)
throws InvocationTargetException,
InterruptedException {
monitor.beginTask(
"Querying module repositories...",
IProgressMonitor.UNKNOWN);
ModuleQuery query =
getModuleQuery("", project);
query.setMemberName(pkg);
query.setMemberSearchPackageOnly(true);
query.setMemberSearchExact(true);
query.setCount(10l);
query.setBinaryMajor(
Versions.JVM_BINARY_MAJOR_VERSION);
ModuleSearchResult msr =
typeChecker
.getContext()
.getRepositoryManager()
.searchModules(query);
for (ModuleDetails md: msr.getResults()) {
proposals.add(new AddModuleImportProposal(
project, unit, md));
}
monitor.done();
}
}
try {
Display.getDefault()
.syncExec(new java.lang.Runnable() {
@Override
public void run() {
try {
getWorkbench()
.getActiveWorkbenchWindow()
.run(true, true, new Runnable());
}
catch (InvocationTargetException e) {
e.printStackTrace();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
catch (Exception e) {
e.printStackTrace();
}*/
}
}