package com.redhat.ceylon.eclipse.code.imports;
import java.util.ArrayList;
import java.util.List;
import com.redhat.ceylon.model.typechecker.model.Declaration;
import com.redhat.ceylon.model.typechecker.model.Module;
import com.redhat.ceylon.model.typechecker.model.Package;
import com.redhat.ceylon.compiler.typechecker.tree.Tree;
import com.redhat.ceylon.compiler.typechecker.tree.Tree.CompilationUnit;
import com.redhat.ceylon.compiler.typechecker.tree.Visitor;
@Deprecated
final class ImportProposalsVisitor extends Visitor {
private final CompilationUnit cu;
private final List<Declaration> proposals;
ImportProposalsVisitor(CompilationUnit cu,
List<Declaration> proposals) {
this.cu = cu;
this.proposals = proposals;
}
public void visit(Tree.BaseMemberOrTypeExpression that) {
super.visit(that);
if (that.getDeclaration()==null) {
String name = that.getIdentifier().getText();
addProposal(cu, proposals, name);
}
}
public void visit(Tree.BaseType that) {
super.visit(that);
if (that.getDeclarationModel()==null) {
String name = that.getIdentifier().getText();
addProposal(cu, proposals, name);
}
}
private void addProposal(final Tree.CompilationUnit cu,
final List<Declaration> proposals, String name) {
for (Declaration p: proposals) {
if (p.getName().equals(name)) return;
}
List<Declaration> possibles = new ArrayList<Declaration>();
Module module = cu.getUnit().getPackage().getModule();
for (Package p: module.getAllVisiblePackages()) {
Declaration d = p.getMember(name, null, false); //TODO: pass sig
if (d!=null && d.isToplevel() &&
d.isShared() && !d.isAnonymous()) {
possibles.add(d);
}
}
Declaration prop;
if (possibles.isEmpty()) {
prop = null;
}
else if (possibles.size()==1) {
prop = possibles.get(0);
}
else {
prop = CleanImportsHandler.select(possibles);
}
if (prop!=null) {
proposals.add(prop);
}
}
}