Maven project fails during model validation [message #1772305] |
Thu, 07 September 2017 19:25 |
Miguel Jimenez Messages: 40 Registered: July 2015 |
Member |
|
|
Hi,
When I use my language from an Eclipse plugin, everything works well. Now I'm configuring a maven project but it fails during model validation.
Here is a minimal language reproducing the error:
MyDsl.xtext
grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.xbase.Xbase
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"
DomainModel:
extensions=ExtensionSection?
importSection=XImportSection?
elements+=AbstractElement*;
ExtensionSection:
declarations+=IncludeDeclaration+;
IncludeDeclaration:
'includes' entity=[Entity|QualifiedName];
AbstractElement:
PackageDeclaration | Entity;
PackageDeclaration:
'package' name=QualifiedName '{'
elements+=AbstractElement*
'}';
Entity:
'entity' name=ValidID body=XBlockExpression;
MyDslRuntimeModule.xtend
package org.xtext.example.mydsl
import com.google.inject.Binder
import com.google.inject.name.Names
import org.eclipse.xtext.scoping.IScopeProvider
import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider
import org.xtext.example.mydsl.scoping.MyDslImportSectionNamespaceScopeProvider
class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {
override void configureIScopeProviderDelegate(Binder binder) {
binder.bind(IScopeProvider)
.annotatedWith(Names.named(AbstractDeclarativeScopeProvider.NAMED_DELEGATE))
.to(MyDslImportSectionNamespaceScopeProvider);
}
}
MyDslModelInferrer.xtend
package org.xtext.example.mydsl.jvmmodel
import com.google.common.collect.Lists
import com.google.inject.Inject
import org.eclipse.xtext.naming.IQualifiedNameProvider
import org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer
import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor
import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder
import org.xtext.example.mydsl.myDsl.DomainModel
import org.xtext.example.mydsl.myDsl.Entity
import org.xtext.example.mydsl.myDsl.PackageDeclaration
class MyDslJvmModelInferrer extends AbstractModelInferrer {
@Inject extension JvmTypesBuilder
@Inject extension IQualifiedNameProvider
def dispatch infer(DomainModel model,
extension IJvmDeclaredTypeAcceptor acceptor, boolean prelinkingPhase) {
if (prelinkingPhase)
return
val entities = model.elements.filter(Entity) + model.elements.filter(PackageDeclaration).entities
entities.forEach[entity|
accept(entity.toClass(entity.fullyQualifiedName)) [
documentation = entity.documentation
members += entity.toMethod("body", typeRef(void)) [
body = entity.body
]
]
]
}
def Iterable<Entity> entities(Iterable<PackageDeclaration> packages) {
val entities = Lists.newArrayList
packages.forEach[^package|
entities.addAll(^package.elements.filter(Entity))
entities.addAll(^package.elements.filter(PackageDeclaration).entities)
]
entities
}
}
MyDslImportSectionNamespaceScopeProvider.xtend
package org.xtext.example.mydsl.scoping
import com.google.common.collect.Lists
import com.google.inject.Inject
import java.util.List
import org.eclipse.emf.ecore.EObject
import org.eclipse.xtext.naming.IQualifiedNameProvider
import org.eclipse.xtext.scoping.impl.ImportNormalizer
import org.eclipse.xtext.xbase.XConstructorCall
import org.eclipse.xtext.xbase.scoping.XImportSectionNamespaceScopeProvider
import org.xtext.example.mydsl.myDsl.DomainModel
import org.xtext.example.mydsl.myDsl.ExtensionSection
// With a little help from https://stackoverflow.com/a/28027025/738968
class MyDslImportSectionNamespaceScopeProvider extends XImportSectionNamespaceScopeProvider {
@Inject extension IQualifiedNameProvider
override List<ImportNormalizer> internalGetImportedNamespaceResolvers(EObject context, boolean ignoreCase) {
switch(context) {
XConstructorCall: {
val container = context.model as DomainModel
if (container.extensions !== null)
container.extensions.provideImportNormalizerList(ignoreCase)
}
}
super.internalGetImportedNamespaceResolvers(context, ignoreCase)
}
/*
* Iterates upwards through the AST until a DomainModel is found.
*/
def EObject model(EObject o) {
switch (o) {
DomainModel: o
default: o.eContainer.model
}
}
/*
* Creates the list of all imports of an ExtensionSection. This implementation is similar to
* getImportedNamespaceResolvers(XImportSection, boolean)
*/
def List<ImportNormalizer> provideImportNormalizerList(ExtensionSection extensionSection, boolean ignoreCase) {
val List<ImportNormalizer> result = Lists.newArrayList
extensionSection.declarations.forEach[includeDecl|
result.add(
includeDecl.entity
.fullyQualifiedName
.toString
.createImportedNamespaceResolver(ignoreCase)
)
]
result
}
}
This is the POM of my example project:
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.test</groupId>
<artifactId>example</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.source.directory>src/main/java</java.source.directory>
<mydsl.source.directory>src/main/java</mydsl.source.directory>
<mydsl.output.directory>target/generated-sources/mydsl</mydsl.output.directory>
</properties>
<dependencies>
<dependency>
<groupId>org.eclipse.xtext</groupId>
<artifactId>org.eclipse.xtext.xbase.lib</artifactId>
<version>2.10.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.eclipse.xtext</groupId>
<artifactId>xtext-maven-plugin</artifactId>
<version>2.10.0</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<javaSourceRoots>
<javaSourceRoot>${java.source.directory}</javaSourceRoot>
</javaSourceRoots>
<sourceRoots>
<sourceRoot>${mydsl.source.directory}</sourceRoot>
</sourceRoots>
<languages>
<language>
<setup>org.xtext.example.mydsl.MyDslStandaloneSetupGenerated</setup>
<javaSupport>true</javaSupport>
<outputConfigurations>
<outputConfiguration>
<outputDirectory>${mydsl.output.directory}</outputDirectory>
</outputConfiguration>
</outputConfigurations>
</language>
</languages>
</configuration>
<dependencies>
<dependency>
<groupId>org.xtext.example.mydsl</groupId>
<artifactId>org.xtext.example.mydsl</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
And two model examples:
foo.mydsl
package foo {
entity B {
println("foo")
}
}
hello.mydsl
includes foo.B
package hello {
entity A {
new B()
}
}
When I run "mvn clean package" this is what I get:
[INFO] --- xtext-maven-plugin:2.10.0:generate (default) @ example ---
[INFO] Encoding: not set. Encoding provider will be used.
[INFO] Compiler source level: 1.6
[INFO] Compiler target level: 1.6
[INFO] Using common types.
[INFO] Collecting source models.
[INFO] Installing type provider.
[INFO] Generating stubs into /Users/miguel/Development/workspace-xtext/example/target/xtext-temp/stubs
[INFO] Compiling stubs located in /Users/miguel/Development/workspace-xtext/example/target/xtext-temp/stubs
[INFO] Nothing to compile. Stubs compilation was skipped.
[INFO] Installing type provider for stubs.
[INFO] Validate and generate.
[INFO] Starting validation for input: 'foo.mydsl'
[INFO] Starting validation for input: 'hello.mydsl'
[ERROR] ERROR:B cannot be resolved. (file:/Users/miguel/Development/workspace-xtext/example/src/main/java/hello.mydsl line : 5 column : 7)
If I comment the constructor call in entity A (i.e., "new B()"), everything works.
Do you know why is this happening?
Thank you.
|
|
|
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.03670 seconds