org.eclipse.xtend.ide.tests.macros.JdtBasedProcessorProviderTest.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.xtend.ide.tests.macros.JdtBasedProcessorProviderTest.java

Source

/**
 * Copyright (c) 2015, 2017 itemis AG (http://www.itemis.eu) and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 */
package org.eclipse.xtend.ide.tests.macros;

import java.util.List;
import java.util.function.Consumer;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.xtend.ide.buildpath.XtendLibClasspathAdder;
import org.eclipse.xtend.ide.tests.WorkbenchTestHelper;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.ui.XtextProjectHelper;
import org.eclipse.xtext.ui.testing.util.IResourcesSetupUtil;
import org.eclipse.xtext.ui.testing.util.JavaProjectSetupUtil;
import org.eclipse.xtext.util.StringInputStream;
import org.eclipse.xtext.xbase.lib.Conversions;
import org.eclipse.xtext.xbase.lib.Exceptions;
import org.junit.After;
import org.junit.Assert;
import org.junit.Test;

/**
 * @author Sven Efftinge - Initial contribution and API
 */
@SuppressWarnings("all")
public class JdtBasedProcessorProviderTest {
    @After
    public void tearDown() throws Exception {
        IResourcesSetupUtil.cleanWorkspace();
    }

    /**
     * https://bugs.eclipse.org/bugs/show_bug.cgi?id=439925
     */
    @Test
    public void testClassLoaderSeesAllUpstreamProjects() {
        try {
            final IJavaProject macroProject = JavaCore
                    .create(WorkbenchTestHelper.createPluginProject("macroProject"));
            StringConcatenation _builder = new StringConcatenation();
            _builder.append("package annotation");
            _builder.newLine();
            _builder.newLine();
            _builder.append("import org.eclipse.xtend.lib.macro.AbstractClassProcessor");
            _builder.newLine();
            _builder.append("import org.eclipse.xtend.lib.macro.Active");
            _builder.newLine();
            _builder.append("import org.eclipse.xtend.lib.macro.TransformationContext");
            _builder.newLine();
            _builder.append("import org.eclipse.xtend.lib.macro.declaration.MutableClassDeclaration");
            _builder.newLine();
            _builder.newLine();
            _builder.append("@Active(MyAAProcessor)");
            _builder.newLine();
            _builder.append("annotation MyAA {");
            _builder.newLine();
            _builder.append("}");
            _builder.newLine();
            _builder.newLine();
            _builder.append("class MyAAProcessor extends AbstractClassProcessor {");
            _builder.newLine();
            _builder.append("\t");
            _builder.newLine();
            _builder.append("\t");
            _builder.append(
                    "override doTransform(MutableClassDeclaration annotatedClass, extension TransformationContext context) {");
            _builder.newLine();
            _builder.append("\t\t");
            _builder.append("val comment = getClass.getClassLoader.loadClass(\"mylib.Lib\").newInstance.toString");
            _builder.newLine();
            _builder.append("\t\t");
            _builder.append("annotatedClass.docComment = comment");
            _builder.newLine();
            _builder.append("\t");
            _builder.append("}");
            _builder.newLine();
            _builder.append("}");
            _builder.newLine();
            this.newSource(macroProject, "annotation/MyAA.xtend", _builder.toString());
            WorkbenchTestHelper.addExportedPackages(macroProject.getProject(), "annotation");
            final IJavaProject libProject = JavaCore.create(WorkbenchTestHelper.createPluginProject("libProject"));
            StringConcatenation _builder_1 = new StringConcatenation();
            _builder_1.append("package mylib");
            _builder_1.newLine();
            _builder_1.newLine();
            _builder_1.append("class Lib {");
            _builder_1.newLine();
            _builder_1.append("\t");
            _builder_1.append("override String toString() {");
            _builder_1.newLine();
            _builder_1.append("\t\t");
            _builder_1.append("return \"HUNKELDUNKEL\"");
            _builder_1.newLine();
            _builder_1.append("\t");
            _builder_1.append("}");
            _builder_1.newLine();
            _builder_1.append("}");
            _builder_1.newLine();
            this.newSource(libProject, "mylib/Lib.xtend", _builder_1.toString());
            WorkbenchTestHelper.addExportedPackages(libProject.getProject(), "mylib");
            IResourcesSetupUtil.waitForBuild();
            final IJavaProject userProject = JavaCore.create(WorkbenchTestHelper.createPluginProject("userProject",
                    "com.google.inject", "org.eclipse.xtend.lib", "org.eclipse.xtext.xbase.lib",
                    "org.eclipse.xtend.ide.tests.data", "org.junit", "macroProject", "libProject"));
            StringConcatenation _builder_2 = new StringConcatenation();
            _builder_2.append("package client");
            _builder_2.newLine();
            _builder_2.newLine();
            _builder_2.append("@annotation.MyAA");
            _builder_2.newLine();
            _builder_2.append("class SomeClass {");
            _builder_2.newLine();
            _builder_2.append("}");
            _builder_2.newLine();
            this.newSource(userProject, "client/A.xtend", _builder_2.toString());
            IResourcesSetupUtil.cleanBuild();
            IResourcesSetupUtil.waitForBuild();
            IResourcesSetupUtil.assertNoErrorsInWorkspace();
            IResource _file = IResourcesSetupUtil.file("userProject/xtend-gen/client/SomeClass.java");
            final String javaCode = WorkbenchTestHelper.getContentsAsString(((IFile) _file));
            Assert.assertTrue(javaCode.contains("HUNKELDUNKEL"));
        } catch (Throwable _e) {
            throw Exceptions.sneakyThrow(_e);
        }
    }

    @Test
    public void testClassLoaderSeesAllUpstreamProjects_01() {
        try {
            final IJavaProject libProject = JavaCore.create(WorkbenchTestHelper.createPluginProject("libProject"));
            StringConcatenation _builder = new StringConcatenation();
            _builder.append("package mylib");
            _builder.newLine();
            _builder.newLine();
            _builder.append("class Lib {");
            _builder.newLine();
            _builder.append("\t");
            _builder.append("override String toString() {");
            _builder.newLine();
            _builder.append("\t\t");
            _builder.append("return \"HUNKELDUNKEL\"");
            _builder.newLine();
            _builder.append("\t");
            _builder.append("}");
            _builder.newLine();
            _builder.append("}");
            _builder.newLine();
            this.newSource(libProject, "mylib/Lib.xtend", _builder.toString());
            WorkbenchTestHelper.addExportedPackages(libProject.getProject(), "mylib");
            final IJavaProject macroProject = JavaCore.create(WorkbenchTestHelper.createPluginProject(
                    "macroProject", "com.google.inject", "org.eclipse.xtend.lib", "org.eclipse.xtext.xbase.lib",
                    "org.eclipse.xtend.ide.tests.data", "org.junit", "libProject"));
            StringConcatenation _builder_1 = new StringConcatenation();
            _builder_1.append("package annotation");
            _builder_1.newLine();
            _builder_1.newLine();
            _builder_1.append("import org.eclipse.xtend.lib.macro.AbstractClassProcessor");
            _builder_1.newLine();
            _builder_1.append("import org.eclipse.xtend.lib.macro.Active");
            _builder_1.newLine();
            _builder_1.append("import org.eclipse.xtend.lib.macro.TransformationContext");
            _builder_1.newLine();
            _builder_1.append("import org.eclipse.xtend.lib.macro.declaration.MutableClassDeclaration");
            _builder_1.newLine();
            _builder_1.newLine();
            _builder_1.append("@Active(MyAAProcessor)");
            _builder_1.newLine();
            _builder_1.append("annotation MyAA {");
            _builder_1.newLine();
            _builder_1.append("}");
            _builder_1.newLine();
            _builder_1.newLine();
            _builder_1.append("class MyAAProcessor extends AbstractClassProcessor {");
            _builder_1.newLine();
            _builder_1.append("\t");
            _builder_1.newLine();
            _builder_1.append("\t");
            _builder_1.append(
                    "override doTransform(MutableClassDeclaration annotatedClass, extension TransformationContext context) {");
            _builder_1.newLine();
            _builder_1.append("\t\t");
            _builder_1.append("annotatedClass.docComment = new mylib.Lib().toString()");
            _builder_1.newLine();
            _builder_1.append("\t");
            _builder_1.append("}");
            _builder_1.newLine();
            _builder_1.append("}");
            _builder_1.newLine();
            this.newSource(macroProject, "annotation/MyAA.xtend", _builder_1.toString());
            WorkbenchTestHelper.addExportedPackages(macroProject.getProject(), "annotation");
            IResourcesSetupUtil.waitForBuild();
            final IJavaProject userProject = JavaCore.create(WorkbenchTestHelper.createPluginProject("userProject",
                    "com.google.inject", "org.eclipse.xtend.lib", "org.eclipse.xtext.xbase.lib",
                    "org.eclipse.xtend.ide.tests.data", "org.junit", "macroProject"));
            StringConcatenation _builder_2 = new StringConcatenation();
            _builder_2.append("package client");
            _builder_2.newLine();
            _builder_2.newLine();
            _builder_2.append("@annotation.MyAA");
            _builder_2.newLine();
            _builder_2.append("class SomeClass {");
            _builder_2.newLine();
            _builder_2.append("}");
            _builder_2.newLine();
            this.newSource(userProject, "client/A.xtend", _builder_2.toString());
            IResourcesSetupUtil.cleanBuild();
            IResourcesSetupUtil.waitForBuild();
            IResourcesSetupUtil.assertNoErrorsInWorkspace();
            IResource _file = IResourcesSetupUtil.file("userProject/xtend-gen/client/SomeClass.java");
            final String javaCode = WorkbenchTestHelper.getContentsAsString(((IFile) _file));
            Assert.assertTrue(javaCode.contains("HUNKELDUNKEL"));
        } catch (Throwable _e) {
            throw Exceptions.sneakyThrow(_e);
        }
    }

    private XtendLibClasspathAdder xtendLibs = new XtendLibClasspathAdder();

    private IJavaProject xtendProject(final String name, final IJavaProject... upstreamProjects) {
        try {
            final IJavaProject result = JavaProjectSetupUtil.createJavaProject(name);
            IResourcesSetupUtil.addNature(result.getProject(), XtextProjectHelper.NATURE_ID);
            this.xtendLibs.addLibsToClasspath(result, null);
            final Consumer<IJavaProject> _function = (IJavaProject it) -> {
                try {
                    JavaProjectSetupUtil.addToClasspath(result, JavaCore.newProjectEntry(it.getPath(), true));
                } catch (Throwable _e) {
                    throw Exceptions.sneakyThrow(_e);
                }
            };
            ((List<IJavaProject>) Conversions.doWrapArray(upstreamProjects)).forEach(_function);
            return result;
        } catch (Throwable _e) {
            throw Exceptions.sneakyThrow(_e);
        }
    }

    @Test
    public void testClassLoaderSeesAllDepsFromReferencedProjects() {
        try {
            final IJavaProject libProject = this.xtendProject("libProject");
            StringConcatenation _builder = new StringConcatenation();
            _builder.append("package mylib");
            _builder.newLine();
            _builder.newLine();
            _builder.append("class Lib {");
            _builder.newLine();
            _builder.append("\t");
            _builder.append("override String toString() {");
            _builder.newLine();
            _builder.append("\t\t");
            _builder.append("return \"HUNKELDUNKEL\"");
            _builder.newLine();
            _builder.append("\t");
            _builder.append("}");
            _builder.newLine();
            _builder.append("}");
            _builder.newLine();
            this.newSource(libProject, "mylib/Lib.xtend", _builder.toString());
            final IJavaProject macroProject = this.xtendProject("macroProject",
                    this.xtendProject("inbetween", libProject));
            StringConcatenation _builder_1 = new StringConcatenation();
            _builder_1.append("package annotation");
            _builder_1.newLine();
            _builder_1.newLine();
            _builder_1.append("import org.eclipse.xtend.lib.macro.AbstractClassProcessor");
            _builder_1.newLine();
            _builder_1.append("import org.eclipse.xtend.lib.macro.Active");
            _builder_1.newLine();
            _builder_1.append("import org.eclipse.xtend.lib.macro.TransformationContext");
            _builder_1.newLine();
            _builder_1.append("import org.eclipse.xtend.lib.macro.declaration.MutableClassDeclaration");
            _builder_1.newLine();
            _builder_1.newLine();
            _builder_1.append("@Active(MyAAProcessor)");
            _builder_1.newLine();
            _builder_1.append("annotation MyAA {");
            _builder_1.newLine();
            _builder_1.append("}");
            _builder_1.newLine();
            _builder_1.newLine();
            _builder_1.append("class MyAAProcessor extends AbstractClassProcessor {");
            _builder_1.newLine();
            _builder_1.append("\t");
            _builder_1.newLine();
            _builder_1.append("\t");
            _builder_1.append(
                    "override doTransform(MutableClassDeclaration annotatedClass, extension TransformationContext context) {");
            _builder_1.newLine();
            _builder_1.append("\t\t");
            _builder_1.append("annotatedClass.docComment = new mylib.Lib().toString()");
            _builder_1.newLine();
            _builder_1.append("\t");
            _builder_1.append("}");
            _builder_1.newLine();
            _builder_1.append("}");
            _builder_1.newLine();
            this.newSource(macroProject, "annotation/MyAA.xtend", _builder_1.toString());
            IResourcesSetupUtil.waitForBuild();
            final IJavaProject userProject = this.xtendProject("userProject", macroProject);
            StringConcatenation _builder_2 = new StringConcatenation();
            _builder_2.append("package client");
            _builder_2.newLine();
            _builder_2.newLine();
            _builder_2.append("@annotation.MyAA");
            _builder_2.newLine();
            _builder_2.append("class SomeClass {");
            _builder_2.newLine();
            _builder_2.append("}");
            _builder_2.newLine();
            this.newSource(userProject, "client/A.xtend", _builder_2.toString());
            IResourcesSetupUtil.cleanBuild();
            IResourcesSetupUtil.waitForBuild();
            IResourcesSetupUtil.assertNoErrorsInWorkspace();
            IResource _file = IResourcesSetupUtil.file("userProject/xtend-gen/client/SomeClass.java");
            final String javaCode = WorkbenchTestHelper.getContentsAsString(((IFile) _file));
            Assert.assertTrue(javaCode.contains("HUNKELDUNKEL"));
        } catch (Throwable _e) {
            throw Exceptions.sneakyThrow(_e);
        }
    }

    @Test
    public void testClassLoaderDoesNotSeeLocalClasses() {
        try {
            final IJavaProject macroProject = this.xtendProject("macroProject");
            StringConcatenation _builder = new StringConcatenation();
            _builder.append("package annotation");
            _builder.newLine();
            _builder.newLine();
            _builder.append("import org.eclipse.xtend.lib.macro.AbstractClassProcessor");
            _builder.newLine();
            _builder.append("import org.eclipse.xtend.lib.macro.Active");
            _builder.newLine();
            _builder.append("import org.eclipse.xtend.lib.macro.TransformationContext");
            _builder.newLine();
            _builder.append("import org.eclipse.xtend.lib.macro.declaration.MutableClassDeclaration");
            _builder.newLine();
            _builder.newLine();
            _builder.append("@Active(MyAAProcessor)");
            _builder.newLine();
            _builder.append("annotation MyAA {");
            _builder.newLine();
            _builder.append("}");
            _builder.newLine();
            _builder.newLine();
            _builder.append("class MyAAProcessor extends AbstractClassProcessor {");
            _builder.newLine();
            _builder.append("\t");
            _builder.newLine();
            _builder.append("\t");
            _builder.append(
                    "override doTransform(MutableClassDeclaration annotatedClass, extension TransformationContext context) {");
            _builder.newLine();
            _builder.append("\t\t");
            _builder.append("try {");
            _builder.newLine();
            _builder.append("\t\t\t");
            _builder.append("Class.forName(\"client.B\")");
            _builder.newLine();
            _builder.append("\t\t");
            _builder.append("} catch (ClassNotFoundException e) {");
            _builder.newLine();
            _builder.append("\t\t\t");
            _builder.append("annotatedClass.docComment = \'classnotfound\'");
            _builder.newLine();
            _builder.append("\t\t");
            _builder.append("}");
            _builder.newLine();
            _builder.append("\t");
            _builder.append("}");
            _builder.newLine();
            _builder.append("}");
            _builder.newLine();
            this.newSource(macroProject, "annotation/MyAA.xtend", _builder.toString());
            IResourcesSetupUtil.waitForBuild();
            final IJavaProject userProject = this.xtendProject("userProject", macroProject);
            StringConcatenation _builder_1 = new StringConcatenation();
            _builder_1.append("package client;");
            _builder_1.newLine();
            _builder_1.append("public class B {}");
            _builder_1.newLine();
            this.newSource(userProject, "client/B.java", _builder_1.toString());
            StringConcatenation _builder_2 = new StringConcatenation();
            _builder_2.append("package client");
            _builder_2.newLine();
            _builder_2.newLine();
            _builder_2.append("@annotation.MyAA");
            _builder_2.newLine();
            _builder_2.append("class SomeClass {");
            _builder_2.newLine();
            _builder_2.append("}");
            _builder_2.newLine();
            this.newSource(userProject, "client/A.xtend", _builder_2.toString());
            IResourcesSetupUtil.cleanBuild();
            IResourcesSetupUtil.waitForBuild();
            IResourcesSetupUtil.assertNoErrorsInWorkspace();
            IResource _file = IResourcesSetupUtil.file("userProject/xtend-gen/client/SomeClass.java");
            final String javaCode = WorkbenchTestHelper.getContentsAsString(((IFile) _file));
            Assert.assertTrue(javaCode.contains("classnotfound"));
        } catch (Throwable _e) {
            throw Exceptions.sneakyThrow(_e);
        }
    }

    public IFile newSource(final IJavaProject it, final String fileName, final String contents) {
        try {
            final IFile result = it.getProject().getFile(("src/" + fileName));
            IContainer parent = result.getParent();
            while ((!parent.exists())) {
                ((IFolder) parent).create(true, false, null);
            }
            StringInputStream _stringInputStream = new StringInputStream(contents);
            result.create(_stringInputStream, true, null);
            return result;
        } catch (Throwable _e) {
            throw Exceptions.sneakyThrow(_e);
        }
    }
}