package com.redhat.ceylon.eclipse.code.correct;
import static com.redhat.ceylon.eclipse.ui.CeylonResources.IMPORT;
import static com.redhat.ceylon.eclipse.util.Nodes.getReferencedModel;
import static com.redhat.ceylon.eclipse.util.Nodes.getReferencedNodeInUnit;
import java.util.Collection;
import java.util.List;
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.compiler.typechecker.tree.Node;
import com.redhat.ceylon.compiler.typechecker.tree.Tree;
import com.redhat.ceylon.eclipse.util.Highlights;
import com.redhat.ceylon.model.typechecker.model.Declaration;
import com.redhat.ceylon.model.typechecker.model.Module;
import com.redhat.ceylon.model.typechecker.model.ModuleImport;
import com.redhat.ceylon.model.typechecker.model.Type;
import com.redhat.ceylon.model.typechecker.model.Unit;
abstract class ExportModuleImportProposal implements ICompletionProposal,
ICompletionProposalExtension6 {
private String desc;
ExportModuleImportProposal(String desc) {
this.desc = desc;
}
// @Override
// public void apply(IDocument document) {
// importsJ2C().importUtil().exportModuleImports(project,
// unit.getPackage().getModule(),
// name);
// }
@Override
public Point getSelection(IDocument document) {
return null;
}
@Override
public String getAdditionalProposalInfo() {
return null;
}
@Override
public String getDisplayString() {
return desc;
}
@Override
public Image getImage() {
return IMPORT;
}
@Override
public IContextInformation getContextInformation() {
return null;
}
@Override
public StyledString getStyledDisplayString() {
return Highlights.styleProposal(getDisplayString(), true);
}
@Deprecated
static void addExportModuleImportProposalForSupertypes(Collection<ICompletionProposal> proposals,
IProject project, Node node, Tree.CompilationUnit rootNode) {
Unit unit = node.getUnit();
if (node instanceof Tree.InitializerParameter) {
node = getReferencedNodeInUnit(getReferencedModel(node), rootNode);
}
if (node instanceof Tree.TypedDeclaration) {
node = ((Tree.TypedDeclaration) node).getType();
}
if (node instanceof Tree.ClassOrInterface) {
Tree.ClassOrInterface c = (Tree.ClassOrInterface) node;
Type extendedType =
c.getDeclarationModel().getExtendedType();
if (extendedType!=null) {
addExportModuleImportProposal(proposals, project,
unit, extendedType.getDeclaration());
for (Type typeArgument:
extendedType.getTypeArgumentList()) {
addExportModuleImportProposal(proposals, project,
unit, typeArgument.getDeclaration());
}
}
List<Type> satisfiedTypes =
c.getDeclarationModel().getSatisfiedTypes();
if (satisfiedTypes!=null) {
for (Type satisfiedType: satisfiedTypes) {
addExportModuleImportProposal(proposals, project,
unit, satisfiedType.getDeclaration());
for (Type typeArgument:
satisfiedType.getTypeArgumentList()) {
addExportModuleImportProposal(proposals, project,
unit, typeArgument.getDeclaration());
}
}
}
}
else if (node instanceof Tree.Type) {
Type type = ((Tree.Type) node).getTypeModel();
addExportModuleImportProposal(proposals, project,
unit, type.getDeclaration());
for (Type typeArgument:
type.getTypeArgumentList()) {
addExportModuleImportProposal(proposals, project,
unit, typeArgument.getDeclaration());
}
}
}
@Deprecated
static void addExportModuleImportProposal(Collection<ICompletionProposal> proposals,
IProject project, Node node) {
if (node instanceof Tree.SimpleType) {
Declaration dec = ((Tree.SimpleType) node).getDeclarationModel();
addExportModuleImportProposal(proposals, project, node.getUnit(), dec);
}
}
@Deprecated
private static void addExportModuleImportProposal(Collection<ICompletionProposal> proposals,
IProject project, Unit unit, Declaration dec) {
Module decModule = dec.getUnit().getPackage().getModule();
for (ModuleImport mi: unit.getPackage().getModule().getImports()) {
if (mi.getModule().equals(decModule)) {
if (mi.isExport()) {
return;
}
}
}
// proposals.add(new ExportModuleImportProposal(project, unit,
// decModule.getNameAsString(), decModule.getVersion()));
}
}