package com.redhat.ceylon.eclipse.code.correct; import static com.redhat.ceylon.eclipse.java2ceylon.Java2CeylonProxies.modelJ2C; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.ltk.core.refactoring.TextFileChange; import org.eclipse.text.edits.MultiTextEdit; import com.redhat.ceylon.compiler.java.runtime.model.TypeDescriptor; import com.redhat.ceylon.compiler.typechecker.TypeChecker; import com.redhat.ceylon.compiler.typechecker.analyzer.UsageWarning; import com.redhat.ceylon.compiler.typechecker.tree.Node; import com.redhat.ceylon.compiler.typechecker.tree.Tree; import com.redhat.ceylon.compiler.typechecker.tree.Tree.CompilationUnit; import com.redhat.ceylon.eclipse.code.editor.CeylonEditor; import com.redhat.ceylon.eclipse.java2ceylon.CorrectJ2C; import com.redhat.ceylon.eclipse.util.EditorUtil; import com.redhat.ceylon.ide.common.correct.QuickFixData; import com.redhat.ceylon.ide.common.correct.addAnnotationQuickFix_; import com.redhat.ceylon.ide.common.correct.assignToLocalQuickFix_; import com.redhat.ceylon.ide.common.correct.ideQuickFixManager_; import com.redhat.ceylon.ide.common.correct.importProposals_; import com.redhat.ceylon.ide.common.correct.refineEqualsHashQuickFix_; import com.redhat.ceylon.ide.common.correct.refineFormalMembersQuickFix_; import com.redhat.ceylon.ide.common.imports.pasteImportsSet_; import com.redhat.ceylon.ide.common.model.BaseCeylonProject; import com.redhat.ceylon.ide.common.platform.CommonDocument; import com.redhat.ceylon.ide.common.platform.DeleteEdit; import com.redhat.ceylon.ide.common.platform.InsertEdit; import com.redhat.ceylon.ide.common.platform.ReplaceEdit; import com.redhat.ceylon.ide.common.platform.TextEdit; import com.redhat.ceylon.model.typechecker.model.Declaration; import ceylon.interop.java.CeylonSet; import ceylon.interop.java.CeylonStringIterable; import ceylon.interop.java.JavaList; public class correctJ2C implements CorrectJ2C { @Override public importProposals_ importProposals() { return importProposals_.get_(); } @Override public ideQuickFixManager_ eclipseQuickFixManager() { return ideQuickFixManager_.get_(); } public addAnnotationQuickFix_ addAnnotationsQuickFix() { return addAnnotationQuickFix_.get_(); } @Override public void addQuickFixes( ProblemLocation problem, Tree.CompilationUnit rootNode, Node node, IProject project, Collection<ICompletionProposal> proposals, CeylonEditor editor, TypeChecker tc, IFile file, IDocument doc) { BaseCeylonProject ceylonProject = modelJ2C().ceylonModel().getProject(project); EclipseQuickFixData data = new EclipseQuickFixData(problem, rootNode, node, project, proposals, editor, ceylonProject, doc); ideQuickFixManager_.get_().addQuickFixes(data, tc); } @Override public void addWarningFixes( ProblemLocation problem, UsageWarning warning, CompilationUnit rootNode, Node node, IProject project, Collection<ICompletionProposal> proposals, CeylonEditor editor, IFile file, IDocument doc) { BaseCeylonProject ceylonProject = modelJ2C().ceylonModel().getProject(project); EclipseQuickFixData data = new EclipseQuickFixData(problem, rootNode, node, project, proposals, editor, ceylonProject, doc); ideQuickFixManager_.get_().addWarningFixes(data, warning); } @Override public void addQuickAssists( Tree.CompilationUnit rootNode, Node node, IProject project, Collection<ICompletionProposal> proposals, CeylonEditor editor, IFile file, IDocument doc, Tree.Statement statement, Tree.Declaration declaration, Tree.NamedArgument argument, Tree.ImportMemberOrType imp, Tree.OperatorExpression oe, int currentOffset) { BaseCeylonProject ceylonProject = modelJ2C().ceylonModel().getProject(project); EclipseQuickFixData data = new EclipseQuickFixData(null, rootNode, node, project, proposals, editor, ceylonProject, doc); ideQuickFixManager_.get_().addQuickAssists(data, statement, declaration, argument, imp, oe, currentOffset); } @Override public void addRefineFormalMembersProposal( CompilationUnit rootNode, Node node, List<ICompletionProposal> list, CeylonEditor ce, IProject project) { IDocument doc = EditorUtil.getDocument(ce.getEditorInput()); QuickFixData data = newData(rootNode, node, list, ce, project, doc); refineFormalMembersQuickFix_.get_() .addRefineFormalMembersProposal(data, false); } @Override public void addRefineEqualsHashProposal( CompilationUnit rootNode, Node node, List<ICompletionProposal> list, CeylonEditor ce, IProject project) { IDocument doc = EditorUtil.getDocument(ce.getEditorInput()); QuickFixData data = newData(rootNode, node, list, ce, project, doc); refineEqualsHashQuickFix_.get_() .addRefineEqualsHashProposal(data, ce.getSelection().getOffset()); } @Override public void addAssignToLocalProposal(CompilationUnit rootNode, Node node, List<ICompletionProposal> list, CeylonEditor ce) { IDocument doc = EditorUtil.getDocument(ce.getEditorInput()); IProject project = EditorUtil.getProject(ce.getEditorInput()); QuickFixData data = newData(rootNode, node, list, ce, project, doc); assignToLocalQuickFix_.get_().addProposal(data); } @Override public QuickFixData newData(CompilationUnit rootNode, Node node, List<ICompletionProposal> list, CeylonEditor ce, IProject project, IDocument doc) { BaseCeylonProject ceylonProject = modelJ2C().ceylonModel() .getProject(project); return new EclipseQuickFixData( new ProblemLocation(0, 0, 0), rootNode, node, null, list, ce, ceylonProject, doc ); } @Override public CommonDocument newDocument(IDocument nativeDoc) { return new EclipseDocument(nativeDoc); } @Override public void importEdits(Object editOrChange, CompilationUnit rootNode, Set<com.redhat.ceylon.model.typechecker.model.Declaration> declarations, Collection<String> aliases, IDocument doc) { List<InsertEdit> edits = new JavaList<InsertEdit>( TypeDescriptor.klass(InsertEdit.class), importProposals_.get_().importEdits( rootNode, new CeylonSet<>(null,declarations), new CeylonStringIterable(aliases), null, newDocument(doc))); for (InsertEdit importEdit: edits) { org.eclipse.text.edits.InsertEdit ie = new org.eclipse.text.edits.InsertEdit( (int) importEdit.getStart(), importEdit.getText()); if (editOrChange instanceof MultiTextEdit) { ((MultiTextEdit) editOrChange).addChild(ie); } else if (editOrChange instanceof TextFileChange) { ((TextFileChange) editOrChange).addEdit(ie); } } } @Override public void importEditForMove(TextFileChange change, CompilationUnit rootNode, Set<Declaration> declarations, Collection<String> aliases, String newName, String oldName, IDocument doc) { List<TextEdit> edits = new JavaList<TextEdit>( TypeDescriptor.klass(InsertEdit.class), importProposals_.get_() .importEditForMove(rootNode, new CeylonSet<>(null,declarations), new CeylonStringIterable(aliases), newName, oldName, newDocument(doc))); for (TextEdit importEdit: edits) { if (importEdit instanceof InsertEdit) { change.addEdit(new org.eclipse.text.edits.InsertEdit( (int) importEdit.getStart(), importEdit.getText())); } else if (importEdit instanceof ReplaceEdit) { change.addEdit(new org.eclipse.text.edits.ReplaceEdit( (int) importEdit.getStart(), (int) importEdit.getLength(), importEdit.getText())); } else if (importEdit instanceof DeleteEdit) { change.addEdit(new org.eclipse.text.edits.DeleteEdit( (int) importEdit.getStart(), (int) importEdit.getLength())); } } } public void pasteImports(Map<Declaration,String> map, MultiTextEdit edit, IDocument doc, Tree.CompilationUnit cu) { for (InsertEdit e : pasteImportsSet_.pasteImportsSet(map, new EclipseDocument(doc), cu)) { edit.addChild(new org.eclipse.text.edits.InsertEdit((int)e.getStart(), e.getText())); } } }