Search in sources :

Example 31 with Fix

use of org.eclipse.xtext.ui.editor.quickfix.Fix in project xtext-xtend by eclipse.

the class XtendQuickfixProvider method removeUnusedPrivateMember.

@Fix(IssueCodes.UNUSED_PRIVATE_MEMBER)
public void removeUnusedPrivateMember(final Issue issue, IssueResolutionAcceptor acceptor) {
    // use the same label, description and image
    // to be able to use the quickfixes (issue resolution) in batch mode
    String label = "Remove member.";
    String description = "Remove the unused private member.";
    String image = "delete_edit.png";
    acceptor.accept(issue, label, description, image, new IModification() {

        @Override
        public void apply(IModificationContext context) throws Exception {
            final IXtextDocument document = context.getXtextDocument();
            document.modify(new IUnitOfWork.Void<XtextResource>() {

                @Override
                public void process(XtextResource state) throws Exception {
                    final EObject element = state.getEObject(issue.getUriToProblem().fragment());
                    final ICompositeNode elementNode = NodeModelUtils.findActualNodeFor(element);
                    final Position elementPosition = new Position(elementNode.getOffset(), elementNode.getLength());
                    document.addPosition(elementPosition);
                    if (element instanceof XtendField) {
                        final JvmField field = associations.getJvmField((XtendField) element);
                        final List<Position> assignments = EcoreUtil2.eAllContentsAsList(element.eResource()).stream().filter(XAssignment.class::isInstance).map(XAssignment.class::cast).filter(assignment -> field == assignment.getFeature()).map(assignment -> {
                            final ICompositeNode assignmentNode = NodeModelUtils.findActualNodeFor(assignment);
                            final int offset = assignmentNode.getOffset();
                            final XExpression assignmentValue = assignment.getValue();
                            int length = assignmentNode.getLength();
                            if (expressionHelper.hasSideEffects(assignmentValue)) {
                                length -= NodeModelUtils.findActualNodeFor(assignmentValue).getLength();
                            }
                            return new Position(offset, length);
                        }).collect(Collectors.toList());
                        for (final Position assignment : assignments) {
                            document.addPosition(assignment);
                        }
                        for (final Position assignment : assignments) {
                            document.replace(assignment.getOffset(), assignment.getLength(), "");
                        }
                    }
                    document.replace(elementPosition.getOffset(), elementPosition.getLength(), "");
                }
            });
            organizeImportsHandler.doOrganizeImports(document);
        }
    });
}
Also used : XtendField(org.eclipse.xtend.core.xtend.XtendField) ITextualMultiModification(org.eclipse.xtext.ui.editor.model.edit.ITextualMultiModification) CoreException(org.eclipse.core.runtime.CoreException) IssueResolutionAcceptor(org.eclipse.xtext.ui.editor.quickfix.IssueResolutionAcceptor) ILeafNode(org.eclipse.xtext.nodemodel.ILeafNode) OrganizeImportsHandler(org.eclipse.xtext.xbase.ui.imports.OrganizeImportsHandler) IRenameRefactoringProvider(org.eclipse.xtext.ui.refactoring.IRenameRefactoringProvider) JvmOperation(org.eclipse.xtext.common.types.JvmOperation) PlatformUI(org.eclipse.ui.PlatformUI) Strings(org.eclipse.xtext.util.Strings) Set(java.util.Set) ISemanticModification(org.eclipse.xtext.ui.editor.model.edit.ISemanticModification) IssueResolution(org.eclipse.xtext.ui.editor.quickfix.IssueResolution) XtendFunction(org.eclipse.xtend.core.xtend.XtendFunction) RenameElementProcessor(org.eclipse.xtext.ui.refactoring.impl.RenameElementProcessor) JvmTypeReference(org.eclipse.xtext.common.types.JvmTypeReference) IXtextDocument(org.eclipse.xtext.ui.editor.model.IXtextDocument) Singleton(com.google.inject.Singleton) Iterables(com.google.common.collect.Iterables) ResourcesPlugin(org.eclipse.core.resources.ResourcesPlugin) IJavaProjectProvider(org.eclipse.xtext.common.types.access.jdt.IJavaProjectProvider) URI(org.eclipse.emf.common.util.URI) InsertionOffsets(org.eclipse.xtend.ide.codebuilder.InsertionOffsets) StopWatch(org.eclipse.xtext.util.StopWatch) JvmGenericType(org.eclipse.xtext.common.types.JvmGenericType) Diagnostic(org.eclipse.xtext.diagnostics.Diagnostic) NodeModelUtils(org.eclipse.xtext.nodemodel.util.NodeModelUtils) ResourceSet(org.eclipse.emf.ecore.resource.ResourceSet) ArrayList(java.util.ArrayList) TypesPackage(org.eclipse.xtext.common.types.TypesPackage) IModification(org.eclipse.xtext.ui.editor.model.edit.IModification) Lists(com.google.common.collect.Lists) XtendTypeDeclaration(org.eclipse.xtend.core.xtend.XtendTypeDeclaration) OverrideHelper(org.eclipse.xtext.xbase.typesystem.override.OverrideHelper) XbaseQuickfixProvider(org.eclipse.xtext.xbase.ui.quickfix.XbaseQuickfixProvider) IFile(org.eclipse.core.resources.IFile) BadLocationException(org.eclipse.jface.text.BadLocationException) IXtendJvmAssociations(org.eclipse.xtend.core.jvmmodel.IXtendJvmAssociations) JvmConstructor(org.eclipse.xtext.common.types.JvmConstructor) EReference(org.eclipse.emf.ecore.EReference) XtendFile(org.eclipse.xtend.core.xtend.XtendFile) XtendPackage(org.eclipse.xtend.core.xtend.XtendPackage) JvmIdentifiableElement(org.eclipse.xtext.common.types.JvmIdentifiableElement) XAssignment(org.eclipse.xtext.xbase.XAssignment) Junit5LibClasspathAdder(org.eclipse.xtend.ide.buildpath.Junit5LibClasspathAdder) Issue(org.eclipse.xtext.validation.Issue) TextSelection(org.eclipse.jface.text.TextSelection) PerformChangeOperation(org.eclipse.ltk.core.refactoring.PerformChangeOperation) ResolvedConstructor(org.eclipse.xtext.xbase.typesystem.override.ResolvedConstructor) XAnnotation(org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotation) LightweightTypeReference(org.eclipse.xtext.xbase.typesystem.references.LightweightTypeReference) ResolvedFeatures(org.eclipse.xtext.xbase.typesystem.override.ResolvedFeatures) RefactoringCore(org.eclipse.ltk.core.refactoring.RefactoringCore) Inject(com.google.inject.Inject) EStructuralFeature(org.eclipse.emf.ecore.EStructuralFeature) IssueCodes(org.eclipse.xtend.core.validation.IssueCodes) Logger(org.apache.log4j.Logger) Junit4LibClasspathAdder(org.eclipse.xtend.ide.buildpath.Junit4LibClasspathAdder) IPath(org.eclipse.core.runtime.IPath) IRenameContextFactory(org.eclipse.xtext.ui.refactoring.ui.IRenameContextFactory) Change(org.eclipse.ltk.core.refactoring.Change) IRenameElementContext(org.eclipse.xtext.ui.refactoring.ui.IRenameElementContext) INode(org.eclipse.xtext.nodemodel.INode) Objects(com.google.common.base.Objects) Position(org.eclipse.jface.text.Position) IJavaProject(org.eclipse.jdt.core.IJavaProject) EObject(org.eclipse.emf.ecore.EObject) XFeatureCall(org.eclipse.xtext.xbase.XFeatureCall) ICompositeNode(org.eclipse.xtext.nodemodel.ICompositeNode) Collectors(java.util.stream.Collectors) Sets(com.google.common.collect.Sets) XtendGrammarAccess(org.eclipse.xtend.core.services.XtendGrammarAccess) Keyword(org.eclipse.xtext.Keyword) List(java.util.List) ReplacingAppendable(org.eclipse.xtext.xbase.ui.contentassist.ReplacingAppendable) IBatchTypeResolver(org.eclipse.xtext.xbase.typesystem.IBatchTypeResolver) DisplayRunHelper(org.eclipse.xtext.ui.util.DisplayRunHelper) XBlockExpression(org.eclipse.xtext.xbase.XBlockExpression) TypeReferences(org.eclipse.xtext.common.types.util.TypeReferences) ProjectUtil(org.eclipse.xtext.ui.refactoring.impl.ProjectUtil) XtendLibClasspathAdder(org.eclipse.xtend.ide.buildpath.XtendLibClasspathAdder) XIfExpression(org.eclipse.xtext.xbase.XIfExpression) MemberFromSuperImplementor(org.eclipse.xtend.ide.codebuilder.MemberFromSuperImplementor) JvmType(org.eclipse.xtext.common.types.JvmType) IssueModificationContext(org.eclipse.xtext.ui.editor.model.edit.IssueModificationContext) EcoreUtil2(org.eclipse.xtext.EcoreUtil2) XtextResource(org.eclipse.xtext.resource.XtextResource) ICompositeModification(org.eclipse.xtext.ui.editor.model.edit.ICompositeModification) XExpression(org.eclipse.xtext.xbase.XExpression) IUnitOfWork(org.eclipse.xtext.util.concurrent.IUnitOfWork) IModificationContext(org.eclipse.xtext.ui.editor.model.edit.IModificationContext) XtendClass(org.eclipse.xtend.core.xtend.XtendClass) XtendExecutable(org.eclipse.xtend.core.xtend.XtendExecutable) JvmField(org.eclipse.xtext.common.types.JvmField) ProcessorBasedRefactoring(org.eclipse.ltk.core.refactoring.participants.ProcessorBasedRefactoring) EList(org.eclipse.emf.common.util.EList) OptionalParameters(org.eclipse.xtext.xbase.ui.document.DocumentSourceAppender.Factory.OptionalParameters) JvmDeclaredType(org.eclipse.xtext.common.types.JvmDeclaredType) ITextRegion(org.eclipse.xtext.util.ITextRegion) NullProgressMonitor(org.eclipse.core.runtime.NullProgressMonitor) IResource(org.eclipse.core.resources.IResource) Fix(org.eclipse.xtext.ui.editor.quickfix.Fix) XtendExpressionHelper(org.eclipse.xtend.core.typing.XtendExpressionHelper) Position(org.eclipse.jface.text.Position) XtextResource(org.eclipse.xtext.resource.XtextResource) CoreException(org.eclipse.core.runtime.CoreException) BadLocationException(org.eclipse.jface.text.BadLocationException) XtendField(org.eclipse.xtend.core.xtend.XtendField) EObject(org.eclipse.emf.ecore.EObject) IModificationContext(org.eclipse.xtext.ui.editor.model.edit.IModificationContext) ICompositeNode(org.eclipse.xtext.nodemodel.ICompositeNode) XExpression(org.eclipse.xtext.xbase.XExpression) JvmField(org.eclipse.xtext.common.types.JvmField) IModification(org.eclipse.xtext.ui.editor.model.edit.IModification) IXtextDocument(org.eclipse.xtext.ui.editor.model.IXtextDocument) XAssignment(org.eclipse.xtext.xbase.XAssignment) Fix(org.eclipse.xtext.ui.editor.quickfix.Fix)

Example 32 with Fix

use of org.eclipse.xtext.ui.editor.quickfix.Fix in project xtext-xtend by eclipse.

the class XtendQuickfixProvider method surroundWithTryCatch.

@Fix(org.eclipse.xtext.xbase.validation.IssueCodes.UNHANDLED_EXCEPTION)
public void surroundWithTryCatch(final Issue issue, IssueResolutionAcceptor acceptor) {
    if (issue.getData() == null || issue.getData().length <= 1) {
        return;
    }
    IModificationContext modificationContext = getModificationContextFactory().createModificationContext(issue);
    IXtextDocument xtextDocument = modificationContext.getXtextDocument();
    if (xtextDocument == null) {
        return;
    }
    if (isJvmConstructorCall(xtextDocument, issue)) {
        return;
    }
    acceptor.accept(issue, "Surround with try/catch block", "Surround with try/catch block", "fix_indent.gif", new ISemanticModification() {

        @Override
        public void apply(EObject element, IModificationContext context) throws Exception {
            String[] issueData = issue.getData();
            URI childURI = URI.createURI(issueData[issueData.length - 1]);
            XtextResource xtextResource = (XtextResource) element.eResource();
            List<JvmType> exceptions = getExceptions(issueData, xtextResource);
            if (exceptions.size() > 0) {
                EObject childThrowingException = xtextResource.getResourceSet().getEObject(childURI, true);
                XExpression toBeSurrounded = findContainerExpressionInBlockExpression(childThrowingException);
                IXtextDocument xtextDocument = context.getXtextDocument();
                if (toBeSurrounded != null) {
                    ICompositeNode toBeSurroundedNode = NodeModelUtils.findActualNodeFor(toBeSurrounded);
                    if (toBeSurroundedNode == null)
                        throw new IllegalStateException("toBeSurroundedNode may not be null");
                    ITextRegion toBeSurroundedRegion = toBeSurroundedNode.getTextRegion();
                    ReplacingAppendable appendable = appendableFactory.create(context.getXtextDocument(), (XtextResource) childThrowingException.eResource(), toBeSurroundedRegion.getOffset(), toBeSurroundedRegion.getLength());
                    appendable.append("try {").increaseIndentation().newLine().append(xtextDocument.get(toBeSurroundedRegion.getOffset(), toBeSurroundedRegion.getLength())).decreaseIndentation().newLine();
                    for (JvmType exceptionType : exceptions) {
                        appendable.append("} catch (").append(exceptionType).append(" exc) {").increaseIndentation().newLine().append("throw new RuntimeException(\"auto-generated try/catch\", exc)").decreaseIndentation().newLine();
                    }
                    appendable.append("}");
                    appendable.commitChanges();
                }
            }
        }
    });
}
Also used : ISemanticModification(org.eclipse.xtext.ui.editor.model.edit.ISemanticModification) XtextResource(org.eclipse.xtext.resource.XtextResource) ReplacingAppendable(org.eclipse.xtext.xbase.ui.contentassist.ReplacingAppendable) JvmType(org.eclipse.xtext.common.types.JvmType) URI(org.eclipse.emf.common.util.URI) CoreException(org.eclipse.core.runtime.CoreException) BadLocationException(org.eclipse.jface.text.BadLocationException) ITextRegion(org.eclipse.xtext.util.ITextRegion) EObject(org.eclipse.emf.ecore.EObject) IModificationContext(org.eclipse.xtext.ui.editor.model.edit.IModificationContext) ICompositeNode(org.eclipse.xtext.nodemodel.ICompositeNode) ArrayList(java.util.ArrayList) List(java.util.List) EList(org.eclipse.emf.common.util.EList) XExpression(org.eclipse.xtext.xbase.XExpression) IXtextDocument(org.eclipse.xtext.ui.editor.model.IXtextDocument) Fix(org.eclipse.xtext.ui.editor.quickfix.Fix)

Example 33 with Fix

use of org.eclipse.xtext.ui.editor.quickfix.Fix in project xtext-eclipse by eclipse.

the class DeclarativeQuickfixProviderTest method testGetResolutions.

@Test
public void testGetResolutions() throws Exception {
    AbstractDeclarativeQuickfixProvider provider = new AbstractDeclarativeQuickfixProvider() {

        @Fix(DeclarativeQuickfixProviderTest.DUMMY_CODE)
        public void fixError1(Issue i, IssueResolutionAcceptor acceptor) {
            acceptor.accept(i, "fixError1", "", "", IModification.NULL);
        }

        @Fix(DeclarativeQuickfixProviderTest.DUMMY_CODE)
        public void fixError2(Issue i, IssueResolutionAcceptor acceptor) {
            acceptor.accept(i, "fixError2", "", "", IModification.NULL);
        }
    };
    provider.setIssueResolutionAcceptorProvider(() -> new IssueResolutionAcceptor(it -> null));
    List<IssueResolution> resolutionsIterable = provider.getResolutions(createIssue(DeclarativeQuickfixProviderTest.DUMMY_CODE + 1));
    assertNull(Iterables.getFirst(resolutionsIterable, null));
    List<IssueResolution> resolutions = provider.getResolutions(createIssue(DeclarativeQuickfixProviderTest.DUMMY_CODE));
    assertEquals(2, resolutions.size());
    assertTrue(resolutions.stream().anyMatch(it -> "fixError1".equals(it.getLabel())));
    assertTrue(resolutions.stream().anyMatch(it -> "fixError2".equals(it.getLabel())));
}
Also used : AbstractDeclarativeQuickfixProvider(org.eclipse.xtext.ui.editor.quickfix.AbstractDeclarativeQuickfixProvider) List(java.util.List) Iterables(com.google.common.collect.Iterables) IModification(org.eclipse.xtext.ui.editor.model.edit.IModification) Issue(org.eclipse.xtext.validation.Issue) Fixes(org.eclipse.xtext.ui.editor.quickfix.Fixes) AbstractDeclarativeQuickfixProvider(org.eclipse.xtext.ui.editor.quickfix.AbstractDeclarativeQuickfixProvider) Test(org.junit.Test) IssueResolutionAcceptor(org.eclipse.xtext.ui.editor.quickfix.IssueResolutionAcceptor) Fix(org.eclipse.xtext.ui.editor.quickfix.Fix) Assert(org.junit.Assert) IssueResolution(org.eclipse.xtext.ui.editor.quickfix.IssueResolution) Issue(org.eclipse.xtext.validation.Issue) IssueResolution(org.eclipse.xtext.ui.editor.quickfix.IssueResolution) IssueResolutionAcceptor(org.eclipse.xtext.ui.editor.quickfix.IssueResolutionAcceptor) Test(org.junit.Test)

Example 34 with Fix

use of org.eclipse.xtext.ui.editor.quickfix.Fix in project xtext-eclipse by eclipse.

the class DeclarativeQuickfixProviderTest method testGetResolutions2.

@Test
public void testGetResolutions2() throws Exception {
    AbstractDeclarativeQuickfixProvider provider = new AbstractDeclarativeQuickfixProvider() {

        @Fix(DeclarativeQuickfixProviderTest.DUMMY_CODE)
        @Fix(DeclarativeQuickfixProviderTest.DUMMY_CODE2)
        public void fixError1(Issue i, IssueResolutionAcceptor acceptor) {
            acceptor.accept(i, "fixError1", "", "", IModification.NULL);
        }

        @Fix(DeclarativeQuickfixProviderTest.DUMMY_CODE)
        public void fixError2(Issue i, IssueResolutionAcceptor acceptor) {
            acceptor.accept(i, "fixError2", "", "", IModification.NULL);
        }

        @Fixes({ @Fix(DeclarativeQuickfixProviderTest.DUMMY_CODE), @Fix(DeclarativeQuickfixProviderTest.DUMMY_CODE2) })
        public void fixError3(Issue i, IssueResolutionAcceptor acceptor) {
            acceptor.accept(i, "fixError3", "", "", IModification.NULL);
        }
    };
    provider.setIssueResolutionAcceptorProvider(() -> {
        return new IssueResolutionAcceptor(it -> null);
    });
    List<IssueResolution> resolutionsIterable = provider.getResolutions(createIssue(DeclarativeQuickfixProviderTest.DUMMY_CODE + 1));
    assertNull(Iterables.getFirst(resolutionsIterable, null));
    List<IssueResolution> resolutions = provider.getResolutions(createIssue(DeclarativeQuickfixProviderTest.DUMMY_CODE));
    assertEquals(3, resolutions.size());
    assertTrue(resolutions.stream().anyMatch(it -> "fixError1".equals(it.getLabel())));
    assertTrue(resolutions.stream().anyMatch(it -> "fixError2".equals(it.getLabel())));
    assertTrue(resolutions.stream().anyMatch(it -> "fixError3".equals(it.getLabel())));
    List<IssueResolution> resolutions2 = provider.getResolutions(createIssue(DeclarativeQuickfixProviderTest.DUMMY_CODE2));
    assertEquals(2, resolutions2.size());
    assertTrue(resolutions.stream().anyMatch(it -> "fixError2".equals(it.getLabel())));
    assertTrue(resolutions.stream().anyMatch(it -> "fixError3".equals(it.getLabel())));
}
Also used : AbstractDeclarativeQuickfixProvider(org.eclipse.xtext.ui.editor.quickfix.AbstractDeclarativeQuickfixProvider) List(java.util.List) Iterables(com.google.common.collect.Iterables) IModification(org.eclipse.xtext.ui.editor.model.edit.IModification) Issue(org.eclipse.xtext.validation.Issue) Fixes(org.eclipse.xtext.ui.editor.quickfix.Fixes) AbstractDeclarativeQuickfixProvider(org.eclipse.xtext.ui.editor.quickfix.AbstractDeclarativeQuickfixProvider) Test(org.junit.Test) IssueResolutionAcceptor(org.eclipse.xtext.ui.editor.quickfix.IssueResolutionAcceptor) Fix(org.eclipse.xtext.ui.editor.quickfix.Fix) Assert(org.junit.Assert) IssueResolution(org.eclipse.xtext.ui.editor.quickfix.IssueResolution) Issue(org.eclipse.xtext.validation.Issue) IssueResolution(org.eclipse.xtext.ui.editor.quickfix.IssueResolution) IssueResolutionAcceptor(org.eclipse.xtext.ui.editor.quickfix.IssueResolutionAcceptor) Test(org.junit.Test)

Example 35 with Fix

use of org.eclipse.xtext.ui.editor.quickfix.Fix in project xtext-eclipse by eclipse.

the class XtextGrammarQuickfixProvider method fixExternalImportedPackage.

@Fix(INVALID_PACKAGE_REFERENCE_EXTERNAL)
public void fixExternalImportedPackage(final Issue issue, IssueResolutionAcceptor acceptor) {
    if (issue.getData().length == 1)
        acceptor.accept(issue, "Update the imported package '" + issue.getData()[0] + "'", "Fix the bogus package import\n" + "import '" + issue.getData()[0] + "'", NULL_QUICKFIX_IMAGE, new IModification() {

            @Override
            public void apply(IModificationContext context) throws BadLocationException {
                String replaceString = valueConverterService.toString(issue.getData()[0], "STRING");
                IXtextDocument document = context.getXtextDocument();
                final List<String> importedPackages = document.priorityReadOnly(new IUnitOfWork<List<String>, XtextResource>() {

                    @Override
                    public List<String> exec(XtextResource state) throws Exception {
                        IResourceDescriptions descriptions = resourceDescriptionsProvider.getResourceDescriptions(state);
                        ResourceSet resourceSet = state.getResourceSet();
                        final Map<URI, URI> uriMap = Maps.newHashMap();
                        EPackage ePackage = loadPackageFromIndex(descriptions, resourceSet, uriMap, issue.getData()[0]);
                        if (ePackage != null) {
                            final Map<String, EPackage> packagePerNsURI = Maps.newHashMap();
                            packagePerNsURI.put(ePackage.getNsURI(), ePackage);
                            final Set<URI> updatedReferences = fixReferencesInPackages(ePackage, packagePerNsURI, uriMap, descriptions, resourceSet);
                            if (updatedReferences.isEmpty())
                                return null;
                            Iterator<EPackage> iterator = packagePerNsURI.values().iterator();
                            while (iterator.hasNext()) {
                                EPackage pack = iterator.next();
                                Resource resource = pack.eResource();
                                if (!resource.getURI().isPlatformResource()) {
                                    iterator.remove();
                                }
                            }
                            final List<String> result = Lists.newArrayList();
                            new WorkspaceModifyOperation() {

                                /* workspace lock */
                                @Override
                                protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
                                    try {
                                        for (EPackage pack : packagePerNsURI.values()) {
                                            Resource resource = pack.eResource();
                                            resource.save(Collections.singletonMap(XMLResource.OPTION_URI_HANDLER, new URIHandlerImpl.PlatformSchemeAware() {

                                                @Override
                                                public URI deresolve(URI uri) {
                                                    // replace archive uris with platform:/plugin
                                                    if (!uri.isArchive() || !updatedReferences.contains(uri)) {
                                                        return super.deresolve(uri);
                                                    }
                                                    URI withoutFragment = uri.trimFragment();
                                                    if (uriMap.containsKey(withoutFragment)) {
                                                        withoutFragment = uriMap.get(withoutFragment);
                                                    }
                                                    return super.deresolve(withoutFragment.appendFragment(uri.fragment()));
                                                }
                                            }));
                                            result.add(resource.getURI().toString());
                                        }
                                    } catch (IOException ioe) {
                                        throw new InvocationTargetException(ioe);
                                    }
                                }
                            }.run(new NullProgressMonitor());
                            for (int i = resourceSet.getResources().size() - 1; i >= 0; i--) {
                                Resource resource = resourceSet.getResources().get(i);
                                if (!resource.getContents().isEmpty() && resource.getContents().get(0) instanceof GenModel) {
                                    resourceSet.getResources().remove(i);
                                }
                            }
                            return result;
                        }
                        return null;
                    }

                    private Set<URI> fixReferencesInPackages(EPackage ePackage, Map<String, EPackage> packagePerNsURI, Map<URI, URI> uriMap, IResourceDescriptions descriptions, ResourceSet resourceSet) {
                        Set<URI> result = Sets.newHashSet();
                        Map<EObject, Collection<Setting>> allReferences = EcoreUtil.CrossReferencer.find(Collections.singletonList(ePackage));
                        for (final Setting setting : Iterables.concat(allReferences.values())) {
                            if (setting.getEStructuralFeature().isChangeable()) {
                                final Object referenced = setting.get(true);
                                List<Object> references = null;
                                if (referenced instanceof EObject) {
                                    references = new AbstractList<Object>() {

                                        @Override
                                        public Object set(int index, Object element) {
                                            setting.set(element);
                                            return referenced;
                                        }

                                        @Override
                                        public Object get(int index) {
                                            return referenced;
                                        }

                                        @Override
                                        public int size() {
                                            return 1;
                                        }
                                    };
                                } else {
                                    @SuppressWarnings("unchecked") List<Object> casted = (List<Object>) referenced;
                                    references = casted;
                                }
                                for (int i = 0; i < references.size(); i++) {
                                    if (references.get(i) instanceof EObject) {
                                        EObject referencedEObject = (EObject) references.get(i);
                                        EPackage transitive = EcoreUtil2.getContainerOfType(referencedEObject, EPackage.class);
                                        if (isRegisteredPackage(transitive)) {
                                            if (referencedEObject instanceof EDataType)
                                                continue;
                                            if (referencedEObject == EcorePackage.Literals.EOBJECT)
                                                continue;
                                            EPackage fromWorkspace = packagePerNsURI.get(transitive.getNsURI());
                                            if (fromWorkspace == null && !packagePerNsURI.containsKey(transitive.getNsURI())) {
                                                fromWorkspace = loadPackageFromIndex(descriptions, resourceSet, uriMap, transitive.getNsURI());
                                                packagePerNsURI.put(transitive.getNsURI(), fromWorkspace);
                                            }
                                            if (fromWorkspace != null) {
                                                String fragment = transitive.eResource().getURIFragment(referencedEObject);
                                                EObject replacement = fromWorkspace.eResource().getEObject(fragment);
                                                if (replacement != null) {
                                                    result.add(EcoreUtil.getURI(replacement));
                                                    references.set(i, replacement);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        return result;
                    }

                    private boolean isRegisteredPackage(EPackage ePackage) {
                        return ePackage != null && (ePackage.eResource() == null || ePackage.getNsURI().equals(ePackage.eResource().getURI().toString()));
                    }

                    private EPackage loadPackageFromIndex(IResourceDescriptions descriptions, ResourceSet resourceSet, Map<URI, URI> uriMap, String nsURI) {
                        Iterable<IEObjectDescription> fixUs = descriptions.getExportedObjects(EcorePackage.Literals.EPACKAGE, QualifiedName.create(nsURI), false);
                        for (IEObjectDescription description : fixUs) {
                            if (description.getEObjectURI().isPlatformResource()) {
                                EObject result = resourceSet.getEObject(description.getEObjectURI(), true);
                                if (result instanceof EPackage) {
                                    return (EPackage) result;
                                }
                            }
                        }
                        URI genModelURI = EcorePlugin.getEPackageNsURIToGenModelLocationMap(false).get(nsURI);
                        if (genModelURI != null) {
                            Resource genmodelResource = resourceSet.getResource(genModelURI, true);
                            GenModel genModel = (GenModel) genmodelResource.getContents().get(0);
                            for (GenPackage genPackage : genModel.getGenPackages()) {
                                Object object = genPackage.eGet(GenModelPackage.Literals.GEN_PACKAGE__ECORE_PACKAGE, false);
                                if (object instanceof EObject) {
                                    EObject proxy = (EObject) object;
                                    URI proxyURI = EcoreUtil.getURI(proxy);
                                    URI resolvedProxyURI = proxyURI.resolve(genModelURI);
                                    if (nsURI.equals(genPackage.getEcorePackage().getNsURI())) {
                                        EPackage result = genPackage.getEcorePackage();
                                        uriMap.put(result.eResource().getURI(), resolvedProxyURI.trimFragment());
                                        return result;
                                    }
                                }
                            }
                        }
                        return null;
                    }
                });
                String delimiter = document.get(issue.getOffset(), 1);
                if (!replaceString.startsWith(delimiter)) {
                    replaceString = delimiter + replaceString.substring(1, replaceString.length() - 1) + delimiter;
                }
                document.replace(issue.getOffset(), issue.getLength(), replaceString);
                if (importedPackages != null && !importedPackages.isEmpty()) {
                    final Shell shell = workbench.getActiveWorkbenchWindow().getShell();
                    shell.getDisplay().asyncExec(new Runnable() {

                        @Override
                        public void run() {
                            String title = "Please update the Ecore2XtextDslProjectContributor that generates the language.";
                            String message = "Please make sure that the Ecore2XtextDslProjectContributor that generates the language is up-to date.\n" + "Especially important is the registration of the referenced packages.\n" + "Please refer to the reference documentation for details.";
                            MessageDialog dialog = new MessageDialog(shell, title, null, message, MessageDialog.INFORMATION, new String[] { "Open Documentation", "Close" }, 1);
                            if (dialog.open() == 0) {
                                try {
                                    workbench.getBrowserSupport().getExternalBrowser().openURL(new URL(GRAMMAR_LANG_DOC));
                                } catch (Exception e) {
                                // ignore
                                }
                            }
                        }
                    });
                }
            }
        });
}
Also used : NullProgressMonitor(org.eclipse.core.runtime.NullProgressMonitor) Set(java.util.Set) ResourceSet(org.eclipse.emf.ecore.resource.ResourceSet) WorkspaceModifyOperation(org.eclipse.ui.actions.WorkspaceModifyOperation) EDataType(org.eclipse.emf.ecore.EDataType) XtextResource(org.eclipse.xtext.resource.XtextResource) GenPackage(org.eclipse.emf.codegen.ecore.genmodel.GenPackage) URI(org.eclipse.emf.common.util.URI) URL(java.net.URL) EPackage(org.eclipse.emf.ecore.EPackage) IEObjectDescription(org.eclipse.xtext.resource.IEObjectDescription) Shell(org.eclipse.swt.widgets.Shell) EObject(org.eclipse.emf.ecore.EObject) Iterator(java.util.Iterator) AbstractList(java.util.AbstractList) List(java.util.List) MessageDialog(org.eclipse.jface.dialogs.MessageDialog) IModification(org.eclipse.xtext.ui.editor.model.edit.IModification) AbstractList(java.util.AbstractList) Setting(org.eclipse.emf.ecore.EStructuralFeature.Setting) Resource(org.eclipse.emf.ecore.resource.Resource) XMLResource(org.eclipse.emf.ecore.xmi.XMLResource) XtextResource(org.eclipse.xtext.resource.XtextResource) ResourceSet(org.eclipse.emf.ecore.resource.ResourceSet) IOException(java.io.IOException) CoreException(org.eclipse.core.runtime.CoreException) InvocationTargetException(java.lang.reflect.InvocationTargetException) BadLocationException(org.eclipse.jface.text.BadLocationException) IOException(java.io.IOException) InvocationTargetException(java.lang.reflect.InvocationTargetException) IProgressMonitor(org.eclipse.core.runtime.IProgressMonitor) IResourceDescriptions(org.eclipse.xtext.resource.IResourceDescriptions) GenModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel) IModificationContext(org.eclipse.xtext.ui.editor.model.edit.IModificationContext) EObject(org.eclipse.emf.ecore.EObject) Map(java.util.Map) IXtextDocument(org.eclipse.xtext.ui.editor.model.IXtextDocument) Fix(org.eclipse.xtext.ui.editor.quickfix.Fix)

Aggregations

Fix (org.eclipse.xtext.ui.editor.quickfix.Fix)43 IModificationContext (org.eclipse.xtext.ui.editor.model.edit.IModificationContext)35 BadLocationException (org.eclipse.jface.text.BadLocationException)29 EObject (org.eclipse.emf.ecore.EObject)25 ISemanticModification (org.eclipse.xtext.ui.editor.model.edit.ISemanticModification)18 IModification (org.eclipse.xtext.ui.editor.model.edit.IModification)17 CoreException (org.eclipse.core.runtime.CoreException)16 IXtextDocument (org.eclipse.xtext.ui.editor.model.IXtextDocument)16 XtextResource (org.eclipse.xtext.resource.XtextResource)13 List (java.util.List)9 WrappedException (org.eclipse.emf.common.util.WrappedException)9 ICompositeNode (org.eclipse.xtext.nodemodel.ICompositeNode)9 ReplacingAppendable (org.eclipse.xtext.xbase.ui.contentassist.ReplacingAppendable)7 ArrayList (java.util.ArrayList)5 EList (org.eclipse.emf.common.util.EList)5 URI (org.eclipse.emf.common.util.URI)5 INode (org.eclipse.xtext.nodemodel.INode)5 IOException (java.io.IOException)4 InvocationTargetException (java.lang.reflect.InvocationTargetException)4 ITextRegion (org.eclipse.xtext.util.ITextRegion)4