diff --git a/plugins/io.sarl.lang.core/META-INF/MANIFEST.MF b/plugins/io.sarl.lang.core/META-INF/MANIFEST.MF index 8a88effdd4..15a34a018a 100644 --- a/plugins/io.sarl.lang.core/META-INF/MANIFEST.MF +++ b/plugins/io.sarl.lang.core/META-INF/MANIFEST.MF @@ -7,7 +7,8 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: %Bundle-Vendor Require-Bundle: org.eclipse.xtext.xbase.lib;bundle-version="2.8.4";visibility:=reexport, javax.inject;bundle-version="1.0.0";visibility:=reexport -Export-Package: io.sarl.lang.annotation, +Export-Package: io.sarl.lang, + io.sarl.lang.annotation, io.sarl.lang.core, io.sarl.lang.scoping.batch, io.sarl.lang.util diff --git a/plugins/io.sarl.lang.core/build.properties b/plugins/io.sarl.lang.core/build.properties index c2525cafc9..2b2a529380 100644 --- a/plugins/io.sarl.lang.core/build.properties +++ b/plugins/io.sarl.lang.core/build.properties @@ -1,4 +1,5 @@ -source.. = src/ +source.. = src/,\ + src-gen/ bin.includes = META-INF/,\ .,\ OSGI-INF/ diff --git a/plugins/io.sarl.lang.core/pom.xml b/plugins/io.sarl.lang.core/pom.xml index ed4109ba9e..14f8a17672 100644 --- a/plugins/io.sarl.lang.core/pom.xml +++ b/plugins/io.sarl.lang.core/pom.xml @@ -27,6 +27,48 @@ + + com.google.code.maven-replacer-plugin + replacer + + + generate-sources + + replace + + + ${project.build.sourceEncoding} + ${project.basedir}/src-templates + ../src-gen + + **/*.java + + + + @sarlspecificationreleaseversion@ + ${sarlspecificationreleaseversion} + + + @sarlreleaseversion@ + ${sarlreleaseversion} + + + @sarlspecificationreleasestatus@ + ${sarlspecificationreleasestatus} + + + @sarlisstableversion@ + ${sarlisstableversion} + + + @janusversion@ + ${janusversion} + + + + + + org.apache.maven.plugins maven-checkstyle-plugin diff --git a/plugins/io.sarl.lang.core/src-gen/io/sarl/lang/SARLVersion.java b/plugins/io.sarl.lang.core/src-gen/io/sarl/lang/SARLVersion.java new file mode 100644 index 0000000000..f9325475f4 --- /dev/null +++ b/plugins/io.sarl.lang.core/src-gen/io/sarl/lang/SARLVersion.java @@ -0,0 +1,71 @@ +/* + * $Id$ + * + * SARL is an general-purpose agent programming language. + * More details on http://www.sarl.io + * + * Copyright (C) 2014-2015 the original authors or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.sarl.lang; + + +/** + * Describes the specification of the SARL language. + * + * @author $Author: sgalland$ + * @version $FullVersion$ + * @mavengroupid $GroupId$ + * @mavenartifactid $ArtifactId$ + * @since 0.3.0 + */ +public final class SARLVersion { + + /** Version number of the SARL specification. + * + *

The version number is usually composed of two digits that + * represent the version of the SARL specification and tools. + */ + public static final String SPECIFICATION_RELEASE_VERSION = "0.3"; //$NON-NLS-1$ + + /** The version number of the current release of the SARL library. + * + *

Usually, the two first digits are the same as the ones of {@link #SPECIFICATION_RELEASE_VERSION}. + */ + public static final String SARL_RELEASE_VERSION = "0.3.0"; //$NON-NLS-1$ + + /** The status of the SARL specification. + * + *

Usually, this status is also displayed in the + * reference documentation of SARL. + */ + public static final String RELEASE_STATUS = "Draft Release"; //$NON-NLS-1$ + + /** Flag that indicates if the current SARL libbrary is a stable release. + * + *

A stable release is collection of libraries that will be not more compiled and generated. + */ + public static final boolean IS_STABLE = false; + + /** The version number of the Janus platform that should support the current version + * of the SARL tools. + */ + public static final String PRECONIZED_JANUS_VERSION = "2.0.3.0-SNAPSHOT"; //$NON-NLS-1$ + + private SARLVersion() { + // + } + +} diff --git a/plugins/io.sarl.lang.core/src-templates/io/sarl/lang/SARLVersion.java b/plugins/io.sarl.lang.core/src-templates/io/sarl/lang/SARLVersion.java new file mode 100644 index 0000000000..03384c469a --- /dev/null +++ b/plugins/io.sarl.lang.core/src-templates/io/sarl/lang/SARLVersion.java @@ -0,0 +1,71 @@ +/* + * $Id$ + * + * SARL is an general-purpose agent programming language. + * More details on http://www.sarl.io + * + * Copyright (C) 2014-2015 the original authors or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.sarl.lang; + + +/** + * Describes the specification of the SARL language. + * + * @author $Author: sgalland$ + * @version $FullVersion$ + * @mavengroupid $GroupId$ + * @mavenartifactid $ArtifactId$ + * @since 0.3.0 + */ +public final class SARLVersion { + + /** Version number of the SARL specification. + * + *

The version number is usually composed of two digits that + * represent the version of the SARL specification and tools. + */ + public static final String SPECIFICATION_RELEASE_VERSION = "@sarlspecificationreleaseversion@"; //$NON-NLS-1$ + + /** The version number of the current release of the SARL library. + * + *

Usually, the two first digits are the same as the ones of {@link #SPECIFICATION_RELEASE_VERSION}. + */ + public static final String SARL_RELEASE_VERSION = "@sarlreleaseversion@"; //$NON-NLS-1$ + + /** The status of the SARL specification. + * + *

Usually, this status is also displayed in the + * reference documentation of SARL. + */ + public static final String RELEASE_STATUS = "@sarlspecificationreleasestatus@"; //$NON-NLS-1$ + + /** Flag that indicates if the current SARL libbrary is a stable release. + * + *

A stable release is collection of libraries that will be not more compiled and generated. + */ + public static final boolean IS_STABLE = @sarlisstableversion@; + + /** The version number of the Janus platform that should support the current version + * of the SARL tools. + */ + public static final String PRECONIZED_JANUS_VERSION = "@janusversion@"; //$NON-NLS-1$ + + private SARLVersion() { + // + } + +} diff --git a/plugins/io.sarl.lang/src/io/sarl/lang/jvmmodel/SARLJvmModelInferrer.java b/plugins/io.sarl.lang/src/io/sarl/lang/jvmmodel/SARLJvmModelInferrer.java index 73ad1d758f..9114431684 100644 --- a/plugins/io.sarl.lang/src/io/sarl/lang/jvmmodel/SARLJvmModelInferrer.java +++ b/plugins/io.sarl.lang/src/io/sarl/lang/jvmmodel/SARLJvmModelInferrer.java @@ -351,6 +351,10 @@ protected void initialize(XtendClass source, JvmGenericType inferredJvmType) { if (Strings.isNullOrEmpty(source.getName())) { return; } + // Issue #363: do not generate the agent if the SARL library is incompatible. + if (!Utils.isCompatibleSARLLibraryOnClasspath(this.typeReferences, source)) { + return; + } openContext(inferredJvmType); try { super.initialize(source, inferredJvmType); @@ -367,6 +371,10 @@ protected void initialize(XtendAnnotationType source, JvmAnnotationType inferred if (Strings.isNullOrEmpty(source.getName())) { return; } + // Issue #363: do not generate the agent if the SARL library is incompatible. + if (!Utils.isCompatibleSARLLibraryOnClasspath(this.typeReferences, source)) { + return; + } openContext(inferredJvmType); try { super.initialize(source, inferredJvmType); @@ -383,6 +391,10 @@ protected void initialize(XtendInterface source, JvmGenericType inferredJvmType) if (Strings.isNullOrEmpty(source.getName())) { return; } + // Issue #363: do not generate the agent if the SARL library is incompatible. + if (!Utils.isCompatibleSARLLibraryOnClasspath(this.typeReferences, source)) { + return; + } openContext(inferredJvmType); try { super.initialize(source, inferredJvmType); @@ -399,6 +411,10 @@ protected void initialize(XtendEnum source, JvmEnumerationType inferredJvmType) if (Strings.isNullOrEmpty(source.getName())) { return; } + // Issue #363: do not generate the agent if the SARL library is incompatible. + if (!Utils.isCompatibleSARLLibraryOnClasspath(this.typeReferences, source)) { + return; + } openContext(inferredJvmType); try { super.initialize(source, inferredJvmType); @@ -451,11 +467,14 @@ public boolean isSupportedMember(XtendMember member) { // Generate the extended types. appendConstrainedExtends(context, inferredJvmType, Agent.class, source.getExtends()); - // Generate the members of the generated type. - appendSarlMembers( - inferredJvmType, - source, - context); + // Issue #363: do not generate the agent if the SARL library is incompatible. + if (Utils.isCompatibleSARLLibraryOnClasspath(this.typeReferences, source)) { + // Generate the members of the generated type. + appendSarlMembers( + inferredJvmType, + source, + context); + } // Add the default constructors for the agent, if not already added if (!context.hasConstructor()) { @@ -543,11 +562,14 @@ public boolean isSupportedMember(XtendMember member) { // Generate the extended types. appendConstrainedExtends(context, inferredJvmType, Behavior.class, source.getExtends()); - // Generate the members of the generated type. - appendSarlMembers( - inferredJvmType, - source, - context); + // Issue #363: do not generate the agent if the SARL library is incompatible. + if (Utils.isCompatibleSARLLibraryOnClasspath(this.typeReferences, source)) { + // Generate the members of the generated type. + appendSarlMembers( + inferredJvmType, + source, + context); + } // Add the default constructors for the behavior, if not already added @@ -619,11 +641,14 @@ public boolean isSupportedMember(XtendMember member) { // Generate the extended types. appendConstrainedExtends(context, inferredJvmType, Event.class, source.getExtends()); - // Generate the members of the generated type. - appendSarlMembers( - inferredJvmType, - source, - context); + // Issue #363: do not generate the agent if the SARL library is incompatible. + if (Utils.isCompatibleSARLLibraryOnClasspath(this.typeReferences, source)) { + // Generate the members of the generated type. + appendSarlMembers( + inferredJvmType, + source, + context); + } if (!context.hasConstructor()) { // Add the default constructors for the behavior, if not already added @@ -719,11 +744,14 @@ public boolean isSupportedMember(XtendMember member) { appendConstrainedExtends(context, inferredJvmType, Skill.class, source.getExtends()); appendConstrainedImplements(context, inferredJvmType, Capacity.class, source.getImplements()); - // Generate the members of the generated type. - appendSarlMembers( - inferredJvmType, - source, - context); + // Issue #363: do not generate the agent if the SARL library is incompatible. + if (Utils.isCompatibleSARLLibraryOnClasspath(this.typeReferences, source)) { + // Generate the members of the generated type. + appendSarlMembers( + inferredJvmType, + source, + context); + } // Add the default constructors for the behavior, if not already added if (!context.hasConstructor()) { @@ -803,11 +831,14 @@ public boolean isSupportedMember(XtendMember member) { // Generate the extended types. appendConstrainedExtends(context, inferredJvmType, Capacity.class, source.getExtends()); - // Generate the members of the generated type. - appendSarlMembers( - inferredJvmType, - source, - context); + // Issue #363: do not generate the agent if the SARL library is incompatible. + if (Utils.isCompatibleSARLLibraryOnClasspath(this.typeReferences, source)) { + // Generate the members of the generated type. + appendSarlMembers( + inferredJvmType, + source, + context); + } // Resolving any name conflict with the generated JVM type this.nameClashResolver.resolveNameClashes(inferredJvmType); diff --git a/plugins/io.sarl.lang/src/io/sarl/lang/util/Utils.java b/plugins/io.sarl.lang/src/io/sarl/lang/util/Utils.java index 692e9c5f92..21cee24985 100644 --- a/plugins/io.sarl.lang/src/io/sarl/lang/util/Utils.java +++ b/plugins/io.sarl.lang/src/io/sarl/lang/util/Utils.java @@ -27,12 +27,14 @@ import java.util.ArrayList; import java.util.BitSet; import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.SortedSet; import com.google.common.base.Strings; import com.ibm.icu.util.VersionInfo; +import org.eclipse.emf.common.notify.Notifier; import org.eclipse.xtend.core.xtend.XtendFunction; import org.eclipse.xtend.core.xtend.XtendMember; import org.eclipse.xtend.core.xtend.XtendParameter; @@ -56,6 +58,7 @@ import org.eclipse.xtext.common.types.JvmTypeParameter; import org.eclipse.xtext.common.types.JvmTypeReference; import org.eclipse.xtext.common.types.JvmVisibility; +import org.eclipse.xtext.common.types.util.TypeReferences; import org.eclipse.xtext.naming.QualifiedName; import org.eclipse.xtext.serializer.ISerializer; import org.eclipse.xtext.xbase.XExpression; @@ -70,6 +73,7 @@ import org.eclipse.xtext.xbase.typesystem.references.StandardTypeReferenceOwner; import org.eclipse.xtext.xbase.typesystem.util.CommonTypeComputationServices; +import io.sarl.lang.SARLVersion; import io.sarl.lang.actionprototype.ActionParameterTypes; import io.sarl.lang.actionprototype.ActionPrototype; import io.sarl.lang.actionprototype.ActionPrototypeProvider; @@ -1041,4 +1045,54 @@ public static boolean hasAbstractMember(XtendTypeDeclaration declaration) { return false; } + /** Check if a compatible SARL library is available on the classpath. + * + * @param typeReferences - the accessor to the types. + * @param context - the context that is providing the access to the classpath. + * @return true if a compatible SARL library was found. + * Otherwise false. + */ + public static boolean isCompatibleSARLLibraryOnClasspath(TypeReferences typeReferences, Notifier context) { + return isCompatibleSARLLibraryVersion(getSARLLibraryVersionOnClasspath(typeReferences, context)); + } + + /** Check if a version in compatible with the expected SARL library. + * + * @param version - the version to test. + * @return true if a compatible SARL library was found. + * Otherwise false. + */ + public static boolean isCompatibleSARLLibraryVersion(String version) { + return org.eclipse.xtext.util.Strings.equal(SARLVersion.SPECIFICATION_RELEASE_VERSION, version); + } + + /** Replies the version of the SARL library on the classpath. + * + * @param typeReferences - the accessor to the types. + * @param context - the context that is providing the access to the classpath. + * @return the version, or null if the SARL library cannot be found or + * is too old. + */ + public static String getSARLLibraryVersionOnClasspath(TypeReferences typeReferences, Notifier context) { + try { + JvmType type = typeReferences.findDeclaredType(SARLVersion.class.getName(), context); + if (type instanceof JvmDeclaredType) { + JvmField versionField = null; + Iterator iterator = ((JvmDeclaredType) type).getDeclaredFields().iterator(); + while (versionField == null && iterator.hasNext()) { + JvmField field = iterator.next(); + if ("SPECIFICATION_RELEASE_VERSION".equals(field.getSimpleName())) { //$NON-NLS-1$ + versionField = field; + } + } + if (versionField != null) { + return versionField.getConstantValueAsString(); + } + } + } catch (Throwable exception) { + // + } + return null; + } + } diff --git a/plugins/io.sarl.lang/src/io/sarl/lang/validation/IssueCodes.java b/plugins/io.sarl.lang/src/io/sarl/lang/validation/IssueCodes.java index 20d2019fd6..623006244c 100644 --- a/plugins/io.sarl.lang/src/io/sarl/lang/validation/IssueCodes.java +++ b/plugins/io.sarl.lang/src/io/sarl/lang/validation/IssueCodes.java @@ -116,6 +116,18 @@ public final class IssueCodes { public static final String RETURN_TYPE_SPECIFICATION_IS_RECOMMENDED = ISSUE_CODE_PREFIX + "return_type_specification_is_recommended"; //$NON-NLS-1$ + /** + * The SARL library is not on the classpath. + */ + public static final String SARL_LIB_NOT_ON_CLASSPATH = + ISSUE_CODE_PREFIX + "sarl_lib_not_on_classpath"; //$NON-NLS-1$ + + /** + * The SARL library found on the classpath is not compatible with the compiler's version. + */ + public static final String INVALID_SARL_LIB_ON_CLASSPATH = + ISSUE_CODE_PREFIX + "invalid_sarl_lib_on_classpath"; //$NON-NLS-1$ + private IssueCodes() { // } diff --git a/plugins/io.sarl.lang/src/io/sarl/lang/validation/Messages.java b/plugins/io.sarl.lang/src/io/sarl/lang/validation/Messages.java index ad02d55f0d..a544a89c52 100644 --- a/plugins/io.sarl.lang/src/io/sarl/lang/validation/Messages.java +++ b/plugins/io.sarl.lang/src/io/sarl/lang/validation/Messages.java @@ -65,7 +65,9 @@ public class Messages extends NLS { public static String SARLJavaValidator_36; public static String SARLJavaValidator_37; public static String SARLJavaValidator_38; + public static String SARLJavaValidator_39; public static String SARLJavaValidator_4; + public static String SARLJavaValidator_40; public static String SARLJavaValidator_5; public static String SARLJavaValidator_6; public static String SARLJavaValidator_7; diff --git a/plugins/io.sarl.lang/src/io/sarl/lang/validation/SARLJavaValidator.java b/plugins/io.sarl.lang/src/io/sarl/lang/validation/SARLJavaValidator.java index 06340f81c7..60e334ec00 100644 --- a/plugins/io.sarl.lang/src/io/sarl/lang/validation/SARLJavaValidator.java +++ b/plugins/io.sarl.lang/src/io/sarl/lang/validation/SARLJavaValidator.java @@ -92,6 +92,7 @@ import java.util.TreeMap; import com.google.common.base.Objects; +import com.google.common.base.Strings; import com.google.common.base.Supplier; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; @@ -117,6 +118,7 @@ import org.eclipse.xtend.core.xtend.XtendFunction; import org.eclipse.xtend.core.xtend.XtendInterface; import org.eclipse.xtend.core.xtend.XtendMember; +import org.eclipse.xtend.core.xtend.XtendPackage; import org.eclipse.xtend.core.xtend.XtendTypeDeclaration; import org.eclipse.xtext.common.types.JvmAnnotationReference; import org.eclipse.xtext.common.types.JvmAnnotationValue; @@ -144,13 +146,14 @@ import org.eclipse.xtext.xbase.lib.CollectionLiterals; import org.eclipse.xtext.xbase.lib.Functions; import org.eclipse.xtext.xbase.lib.IterableExtensions; -import org.eclipse.xtext.xbase.lib.ReassignFirstArgument; +import org.eclipse.xtext.xbase.lib.util.ToStringBuilder; import org.eclipse.xtext.xbase.typesystem.override.IOverrideCheckResult.OverrideCheckDetails; import org.eclipse.xtext.xbase.typesystem.override.IResolvedOperation; import org.eclipse.xtext.xbase.typesystem.references.LightweightTypeReference; import org.eclipse.xtext.xbase.validation.FeatureNameValidator; import io.sarl.lang.SARLLangActivator; +import io.sarl.lang.SARLVersion; import io.sarl.lang.actionprototype.ActionParameterTypes; import io.sarl.lang.actionprototype.ActionPrototypeProvider; import io.sarl.lang.annotation.ImportedCapacityFeature; @@ -360,10 +363,10 @@ public void checkRequiredCapacityUse(SarlRequiredCapacity statement) { null); } - /** Check if the SARL libraries are in the classpath. + /** Check if the JRE, the XBase, and the SARL libraries are on the classpath. * *

This function is overriding the function given by the Xtend validator - * for firing a warning in place of an error. + * for having finer tests, and firing a warning in place of an error. * * @param sarlScript - the SARL script. */ @@ -382,17 +385,34 @@ public void checkClassPath(XtendFile sarlScript) { error( MessageFormat.format(Messages.SARLValidator_0, minJdkVersion), sarlScript, - null, + XtendPackage.Literals.XTEND_FILE__PACKAGE, JDK_NOT_ON_CLASSPATH); } - if (typeReferences.findDeclaredType(ReassignFirstArgument.class, sarlScript) == null) { + // XXX: Update the following type according to the super type's implementation. + if (typeReferences.findDeclaredType(ToStringBuilder.class, sarlScript) == null) { error( MessageFormat.format(Messages.SARLValidator_1, minXtextVersion), sarlScript, - null, + XtendPackage.Literals.XTEND_FILE__PACKAGE, XBASE_LIB_NOT_ON_CLASSPATH); } + + String sarlOnClasspath = Utils.getSARLLibraryVersionOnClasspath(typeReferences, sarlScript); + if (Strings.isNullOrEmpty(sarlOnClasspath)) { + error( + Messages.SARLJavaValidator_39, + sarlScript, + XtendPackage.Literals.XTEND_FILE__PACKAGE, + io.sarl.lang.validation.IssueCodes.SARL_LIB_NOT_ON_CLASSPATH); + } else if (!Utils.isCompatibleSARLLibraryVersion(sarlOnClasspath)) { + error( + MessageFormat.format(Messages.SARLJavaValidator_40, + sarlOnClasspath, SARLVersion.SPECIFICATION_RELEASE_VERSION), + sarlScript, + XtendPackage.Literals.XTEND_FILE__PACKAGE, + io.sarl.lang.validation.IssueCodes.INVALID_SARL_LIB_ON_CLASSPATH); + } } @Check diff --git a/plugins/io.sarl.lang/src/io/sarl/lang/validation/messages.properties b/plugins/io.sarl.lang/src/io/sarl/lang/validation/messages.properties index c17c2920bf..b37445187a 100644 --- a/plugins/io.sarl.lang/src/io/sarl/lang/validation/messages.properties +++ b/plugins/io.sarl.lang/src/io/sarl/lang/validation/messages.properties @@ -31,7 +31,9 @@ SARLJavaValidator_35=The abstract method {0} in type {1} can only be defined by SARLJavaValidator_36=The method {0} in type {1} should be declared abstract. SARLJavaValidator_37='Create'-method {0} is not permitted in an interface SARLJavaValidator_38=Abstract methods do not specify a body +SARLJavaValidator_39=SARL library not found on the classpath, or older than 0.3.0. SARLJavaValidator_4=Nested agents are not allowed inside {0}. +SARLJavaValidator_40=Incompatible SARL library on the classpath. Actual: {0}. Expected: {1}. SARLJavaValidator_5=behavior {0} SARLJavaValidator_6=Nested behaviors are not allowed inside {0}. SARLJavaValidator_7=capacity {0} diff --git a/pom.xml b/pom.xml index 6d66c59fba..a2a620311f 100644 --- a/pom.xml +++ b/pom.xml @@ -357,15 +357,18 @@ def snapshotTag = "-SNAPSHOT"; def version; def releaseStatus; + def isSnapshot; def endOfVersion; if (project.version.endsWith(snapshotTag)) { def len = project.version.size() - snapshotTag.size(); version = project.version.substring(0, len); releaseStatus = "Draft Release"; + isSnapshot = true; endOfVersion = snapshotTag; } else { version = project.version; releaseStatus = "Stable Release"; + isSnapshot = false; endOfVersion = ""; } versionFields = version.split("\\."); @@ -376,12 +379,14 @@ project.properties.sarlreleaseversion = project.properties.sarlspecificationreleaseversion + "." + versionFields[2]; project.properties.sarlspecificationreleasedate = (new java.text.SimpleDateFormat("yyyy-MM-dd")).format(now); project.properties.sarlspecificationreleasestatus = releaseStatus; + project.properties.sarlisstableversion = Boolean.toString(!isSnapshot); project.properties.janusversion = "2."+versionFields[0]+"."+versionFields[1]+".0"+endOfVersion; println("\tset sarlspecificationreleaseversion to: " + project.properties.sarlspecificationreleaseversion); println("\tset sarlreleaseversion to: " + project.properties.sarlreleaseversion); println("\tset sarlspecificationreleasedate to: " + project.properties.sarlspecificationreleasedate); println("\tset sarlspecificationreleasestatus to: " + project.properties.sarlspecificationreleasestatus); + println("\tset sarlisstableversion to: " + project.properties.sarlisstableversion); println("\tset janusversion to: " + project.properties.janusversion); ]]> diff --git a/tests/io.sarl.tests.testdata/src/foo/io.sarl.lang.core-0.2.0-fake1.jar b/tests/io.sarl.tests.testdata/src/foo/io.sarl.lang.core-0.2.0-fake1.jar new file mode 100644 index 0000000000..58fb15fb9d Binary files /dev/null and b/tests/io.sarl.tests.testdata/src/foo/io.sarl.lang.core-0.2.0-fake1.jar differ diff --git a/tests/io.sarl.tests.testdata/src/foo/io.sarl.lang.core-0.2.0-fake2.jar b/tests/io.sarl.tests.testdata/src/foo/io.sarl.lang.core-0.2.0-fake2.jar new file mode 100644 index 0000000000..19cc5a6ab4 Binary files /dev/null and b/tests/io.sarl.tests.testdata/src/foo/io.sarl.lang.core-0.2.0-fake2.jar differ