Error when updating XText versions for Gradle 6

359 views Asked by At

I am attempting to update an EMF/XCore project to newer versions to get around a versioning roadblock. Currently the repository that houses this project must target Gradle 4 and Bndtools 4.3 because of problems when targeting newer versions. I readily admit that a problem here is my lack of understanding of XText, XCore, and otherwise. Now I find myself on a machine without access to Java 8 which has forced an attempt to update the project settings if at all possible.

The last safe targets for this project were XText 2.16.0 and org.xtext.builder version 1.0.21. The examples I have been able to locate match the settings of this project for the most part.

So now, attempting to run in a Gradle 6.3 environment with OpenJDK 13 (if the Java version is the issue that can be changed)...

Notes

  • Some changes are based on researching solutions to my build problem and some comments are added
  • ${mavenURL} is currently pointing to Maven Central
  • I added the compile platform() line based on XText's Release notes. It does not seem to help this issue, though
  • I changed version numbers to match those found in the Maven BOM
  • I have attempted various combinations of changing the org.xtext.builder version as well as targeting both EMF 2.21 and 2.20
  • I have tried a lower XText version. 2.17.0 fails with a different issue

build.gradle:

plugins {
    id 'org.xtext.builder' version '2.0.8'
    id 'java' // Helpful? Doesn't appear so
}

repositories {
   maven() {
      url "${mavenURL}"
   }
}

ext.xtextVersion = "2.21.0"
ext.emfVersion = "2.20.0"

dependencies {
   compile platform("org.eclipse.xtext:xtext-dev-bom:${xtextVersion}")

   xtextLanguages 'org.eclipse.emf:org.eclipse.emf.codegen.ecore.xtext:1.4.0'
   xtextLanguages('org.eclipse.emf:org.eclipse.emf.ecore.xcore:1.12.0') {
      exclude group: 'org.antlr', module: 'antlr-runtime'
   } 
   xtextLanguages "org.eclipse.xtext:org.eclipse.xtext.ecore:${xtextVersion}"
   xtextLanguages "org.eclipse.xtext:org.eclipse.xtext.xbase.lib:${xtextVersion}"

   xtextLanguages 'org.eclipse.emf:org.eclipse.emf.codegen:2.19.0'
   xtextLanguages 'org.eclipse.emf:org.eclipse.emf.codegen.ecore:${emfVersion}'
   xtextLanguages 'org.eclipse.emf:org.eclipse.emf.mwe2.runtime:2.11.2'

   compile "org.eclipse.xtext:org.eclipse.xtext:${xtextVersion}"
   compile "org.eclipse.xtext:org.eclipse.xtext.xbase:${xtextVersion}"
   compile 'org.eclipse.emf:org.eclipse.emf.ecore.xcore.lib:1.4.0'
}

xtext {
    version = "${xtextVersion}"
    languages {
        ecore {
            setup = 'org.eclipse.xtext.ecore.EcoreSupport'
        }
        codegen {
            setup = 'org.eclipse.emf.codegen.ecore.xtext.GenModelSupport'
        }
        xcore {
            setup = 'org.eclipse.emf.ecore.xcore.XcoreStandaloneSetup'
            generator.outlet.producesJava = true
            // Have also tried generator.javaSourceLevel = '1.8'
        }
    }
    sourceSets {
        main {
            srcDir 'model'
            // Move the generated Xcore output to the src directory
            output {
                dir(xtext.languages.xcore.generator.outlet, 'src-gen')
            }
        }
    }
}

Multiple tries have ended up resulting in the following error:

> ./gradlew jar
...

> Task :com.example.project:generateXtext FAILED
ERROR:A generic type in this context must refer to a classifier or a type parameter (file:...file.xcore)
...
> Xtext validation failed, see build log for details.

for a multitude of lines. The XCore file looks something like this

@GenModel(
      complianceLevel="8.0",
      loadInitialization="false",
      modelDirectory="com.example.project/src-gen",
      bundleManifest="false",
      updateClasspath="false",
      oSGiCompatible="true",
      forceOverwrite="true")
@Ecore(
   nsPrefix="query",
   nsURI="something"
)

// These lines had to be added to resolve the above annotations no longer working
annotation "http://www.eclipse.org/emf/2002/GenModel" as GenModel
annotation "http://www.eclipse.org/emf/2002/Ecore" as Ecore

interface Node wraps an.external.Node {}

abstract class ENode extends Node
{
    op Object getParent() // This line fails due to not referring to object or classifier
    {
        eContainer
    }   
}

I have seen this error pop up in bug reports on XText sites (such as https://github.com/eclipse/xtext-maven/issues/71), and they were resolved. But generally the projects reference Github examples such as https://github.com/itemis/itemis-blog/tree/xcore_gradle or https://github.com/ghillairet/xcore-gradle-example which both point to versions of XText and the corresponding builder which were indeed working prior to this upgrade attempt.

The project is an XText project. Relevant portion of the .project file is here:

    <buildSpec>
        <buildCommand>
            <name>bndtools.core.bndbuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>org.eclipse.jdt.core.javabuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
    </buildSpec>
    <natures>
        <nature>bndtools.core.bndnature</nature>
        <nature>org.eclipse.jdt.core.javanature</nature>
        <nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
      <nature>org.eclipse.pde.PluginNature</nature>
    </natures>

Any help would be appreciated.

1

There are 1 answers

0
Jaedabee On BEST ANSWER

I received assistance from the folks working on the XText Gradle plug-in via https://github.com/xtext/xtext-gradle-plugin/issues/171.

The biggest issue is that src-gen cannot exist on the classpath prior to execution of the generateXText task. To assist with this updating the clean task to remove the src-gen folder is recommended. Additionally, the second 3 compile dependencies should be xtextLanguages dependencies.