Skip to content

Commit 5df47a7

Browse files
committed
[eclipse-archived/xtext-core#1835] better treatment of unsupported Java versions in Xtext
Signed-off-by: Christian Dietrich <christian.dietrich@itemis.de>
1 parent 1738f18 commit 5df47a7

File tree

1 file changed

+59
-68
lines changed

1 file changed

+59
-68
lines changed

xtext-gradle-builder/src/main/java/org/xtext/gradle/builder/XtextGradleBuilder.xtend

Lines changed: 59 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import java.net.URLClassLoader
1212
import java.util.List
1313
import java.util.Set
1414
import java.util.concurrent.ConcurrentHashMap
15-
import org.eclipse.emf.common.notify.Notifier
1615
import org.eclipse.emf.common.util.URI
1716
import org.eclipse.xtext.ISetup
1817
import org.eclipse.xtext.build.BuildRequest
@@ -52,7 +51,7 @@ class XtextGradleBuilder implements IncrementalXtextBuilder {
5251
val sharedInjector = Guice.createInjector
5352
val incrementalbuilder = sharedInjector.getInstance(IncrementalBuilder)
5453
val debugInfoInstaller = sharedInjector.getInstance(DebugInfoInstaller)
55-
54+
5655
new(Set<String> setupNames, String encoding) throws Exception {
5756
System.setProperty("org.eclipse.emf.common.util.ReferenceClearingQueue", "false")
5857
for (setupName : setupNames) {
@@ -67,12 +66,12 @@ class XtextGradleBuilder implements IncrementalXtextBuilder {
6766
val containerHandle = gradleRequest.containerHandle
6867
val validator = new GradleValidatonCallback(gradleRequest.logger)
6968
val response = new GradleBuildResponse
70-
69+
7170
indexChangedClasspathEntries(gradleRequest)
72-
71+
7372
val request = new BuildRequest => [
7473
baseDir = createFolderURI(gradleRequest.projectDir)
75-
if(needsCleanBuild(gradleRequest)) {
74+
if (needsCleanBuild(gradleRequest)) {
7675
dirtyFiles = gradleRequest.allFiles.map[URI.createFileURI(absolutePath)].toList
7776
state = new IndexState
7877
} else {
@@ -84,28 +83,28 @@ class XtextGradleBuilder implements IncrementalXtextBuilder {
8483
}
8584

8685
afterValidate = validator
87-
afterGenerateFile = [source, target|response.generatedFiles.add(new File(target.toFileString))]
88-
86+
afterGenerateFile = [source, target| response.generatedFiles.add(new File(target.toFileString))]
87+
8988
preparResourceSet(containerHandle, state.resourceDescriptions, gradleRequest)
9089
]
91-
90+
9291
val result = doBuild(request, gradleRequest)
93-
94-
if(!validator.isErrorFree) {
92+
93+
if (!validator.isErrorFree) {
9594
throw new GradleException("Xtext validation failed, see build log for details.")
9695
}
97-
96+
9897
val resultingIndex = result.indexState
9998
index.setContainer(containerHandle, resultingIndex.resourceDescriptions)
10099
generatedMappings.put(containerHandle, resultingIndex.fileMappings)
101100
return response
102101
}
103-
102+
104103
private def indexChangedClasspathEntries(GradleBuildRequest gradleRequest) {
105104
val registry = IResourceServiceProvider.Registry.INSTANCE
106-
gradleRequest.dirtyClasspathEntries.filter[exists].forEach [ dirtyClasspathEntry |
105+
gradleRequest.dirtyClasspathEntries.filter[exists].forEach[dirtyClasspathEntry|
107106
val hash = hash(dirtyClasspathEntry)
108-
if(dependencyHashes.get(dirtyClasspathEntry) != hash) {
107+
if (dependencyHashes.get(dirtyClasspathEntry) != hash) {
109108
val containerHandle = dirtyClasspathEntry.path
110109
val request = new BuildRequest => [
111110
indexOnly = true
@@ -114,128 +113,136 @@ class XtextGradleBuilder implements IncrementalXtextBuilder {
114113
* Only mark files as dirty that have changed in the jar,
115114
* detect the deleted ones and reuse the existing index chunk for unchanged ones.
116115
*/
117-
dirtyFiles += new PathTraverser().findAllResourceUris(dirtyClasspathEntry.path) [ uri |
116+
dirtyFiles += new PathTraverser().findAllResourceUris(dirtyClasspathEntry.path) [uri|
118117
registry.getResourceServiceProvider(uri) !== null
119118
]
120-
121-
afterValidate = [false] // workaround for indexOnly not working in Xtext 2.9.0
119+
120+
afterValidate = [false] //workaround for indexOnly not working in Xtext 2.9.0
121+
122122
val indexChunk = new ResourceDescriptionsData(emptyList)
123123
val fileMappings = new Source2GeneratedMapping
124124
state = new IndexState(indexChunk, fileMappings)
125125
preparResourceSet(containerHandle, indexChunk, gradleRequest)
126126
]
127-
127+
128128
val result = doBuild(request, gradleRequest)
129129
val resultingIndex = result.indexState
130130
index.setContainer(containerHandle, resultingIndex.resourceDescriptions)
131131
dependencyHashes.put(dirtyClasspathEntry, hash)
132132
}
133133
]
134134
}
135-
135+
136136
private def HashCode hash(File file) {
137137
val hasher = Hashing.md5.newHasher
138138
hash(file, hasher)
139139
hasher.hash
140140
}
141-
141+
142142
private def void hash(File file, Hasher hasher) {
143-
if(file.isDirectory) {
143+
if (file.isDirectory) {
144144
file.listFiles.forEach[hash(hasher)]
145145
} else {
146146
Files.asByteSource(file).copyTo(Funnels.asOutputStream(hasher))
147147
}
148148
}
149-
149+
150150
private def preparResourceSet(BuildRequest it, String containerHandle, ResourceDescriptionsData indexChunk, GradleBuildRequest gradleRequest) {
151151
resourceSet = sharedInjector.getInstance(XtextResourceSet) => [
152152
classpathURIContext = gradleRequest.jvmTypesLoader
153153
attachProjectConfig(gradleRequest)
154154
attachGeneratorConfig(gradleRequest)
155155
attachOutputConfig(gradleRequest)
156156
attachPreferences(gradleRequest)
157-
attachJavaConfig(gradleRequest)
158157
attachProjectDescription(containerHandle, gradleRequest.allClasspathEntries.map[path].toList, it)
159158
val contextualIndex = index.createShallowCopyWith(it)
160159
contextualIndex.setContainer(containerHandle, indexChunk)
161160
]
162161
}
163-
162+
164163
private def doBuild(BuildRequest request, GradleBuildRequest gradleRequest) {
165164
try {
166165
val registry = IResourceServiceProvider.Registry.INSTANCE
167-
if(needsCleanBuild(gradleRequest)) {
166+
if (needsCleanBuild(gradleRequest)) {
168167
doClean(gradleRequest)
169168
}
170-
incrementalbuilder.build(request, [uri|registry.getResourceServiceProvider(uri)])
169+
incrementalbuilder.build(request, [uri| registry.getResourceServiceProvider(uri)])
171170
} finally {
172171
cleanup(gradleRequest, request)
173172
}
174173
}
175-
174+
176175
private def doClean(GradleBuildRequest request) {
177-
request.generatorConfigsByLanguage.values.map[outputConfigs].flatten.filter[cleanAutomatically].map[target].forEach [
178-
deleteRecursive
179-
]
176+
request.generatorConfigsByLanguage.values
177+
.map[outputConfigs].flatten
178+
.filter[cleanAutomatically]
179+
.map[target]
180+
.forEach[
181+
deleteRecursive
182+
]
180183
}
181-
184+
182185
private def void deleteRecursive(File file) {
183-
if(file.isDirectory) {
186+
if (file.isDirectory) {
184187
file.listFiles.forEach[deleteRecursive]
185188
}
186189
file.delete
187190
}
188-
191+
189192
private def boolean needsCleanBuild(GradleBuildRequest request) {
190193
!request.incremental || !request.dirtyClasspathEntries.isEmpty || index.getContainer(request.containerHandle) === null
191194
}
192-
195+
193196
private def getJvmTypesLoader(GradleBuildRequest gradleRequest) {
194-
val parent = if(gradleRequest.bootstrapClasspath === null || gradleRequest.bootstrapClasspath.empty) {
195-
ClassLoader.systemClassLoader
196-
} else {
197-
new AlternateJdkLoader(gradleRequest.bootstrapClasspath)
198-
}
197+
val parent = if (gradleRequest.bootstrapClasspath === null || gradleRequest.bootstrapClasspath.empty) {
198+
ClassLoader.systemClassLoader
199+
} else {
200+
new AlternateJdkLoader(gradleRequest.bootstrapClasspath)
201+
}
199202
new URLClassLoader(gradleRequest.allClasspathEntries.map[toURI.toURL], parent)
200203
}
201-
204+
202205
private def cleanup(GradleBuildRequest gradleRequest, BuildRequest request) {
203206
val resourceSet = request.resourceSet
204207
val jvmTypesLoader = resourceSet.classpathURIContext
205-
if(jvmTypesLoader instanceof Closeable) {
208+
if (jvmTypesLoader instanceof Closeable) {
206209
try {
207210
jvmTypesLoader.close
208-
} catch(Exception e) {
211+
} catch (Exception e) {
209212
gradleRequest.logger.debug("Couldn't close jvm types classloader", e)
210213
}
211214
}
212215
resourceSet.resources.clear
213216
resourceSet.eAdapters.clear
214217
}
215-
218+
216219
private def attachProjectConfig(XtextResourceSet resourceSet, GradleBuildRequest gradleRequest) {
217220
ProjectConfigAdapter.install(resourceSet, new GradleProjectConfig(gradleRequest))
218221
}
219-
222+
220223
private def attachProjectDescription(String containerHandle, List<String> dependencies, XtextResourceSet resourceSet) {
221224
new ProjectDescription => [
222225
name = containerHandle
223226
it.dependencies = dependencies
224227
attachToEmfObject(resourceSet)
225228
]
226229
}
227-
230+
228231
private def attachGeneratorConfig(XtextResourceSet resourceSet, GradleBuildRequest gradleRequest) {
229232
new GeneratorConfigProvider.GeneratorConfigAdapter => [
230233
attachToEmfObject(resourceSet)
231234
language2GeneratorConfig.putAll(
232-
gradleRequest.generatorConfigsByLanguage.mapValues [ gradleConfig |
235+
gradleRequest.generatorConfigsByLanguage.mapValues[gradleConfig|
236+
val javaVersion = JavaVersion.fromQualifier(gradleConfig.javaSourceLevel.toString)
237+
if (javaVersion === null) {
238+
gradleRequest.logger.warn("Xtext does not support Java " + gradleConfig.javaSourceLevel.toString + ", falling back to " + JavaVersion.JAVA8.label)
239+
}
233240
new GeneratorConfig => [
234241
generateSyntheticSuppressWarnings = gradleConfig.isGenerateSyntheticSuppressWarnings
235242
generateGeneratedAnnotation = gradleConfig.isGenerateGeneratedAnnotation
236-
includeDateInGeneratedAnnotation = gradleConfig.isIncludeDateInGeneratedAnnotation
243+
includeDateInGeneratedAnnotation = gradleConfig.isIncludeDateInGeneratedAnnotation
237244
generatedAnnotationComment = gradleConfig.generatedAnnotationComment
238-
javaSourceVersion = JavaVersion.fromQualifier(gradleConfig.javaSourceLevel.toString)
245+
javaSourceVersion = javaVersion ?: JavaVersion.JAVA8
239246
]
240247
]
241248
)
@@ -244,13 +251,10 @@ class XtextGradleBuilder implements IncrementalXtextBuilder {
244251

245252
private def attachOutputConfig(XtextResourceSet resourceSet, GradleBuildRequest gradleRequest) {
246253
resourceSet.eAdapters += new OutputConfigurationAdapter(
247-
gradleRequest.generatorConfigsByLanguage.mapValues [
248-
outputConfigs.map [ gradleOutputConfig |
254+
gradleRequest.generatorConfigsByLanguage.mapValues[
255+
outputConfigs.map[gradleOutputConfig|
249256
new OutputConfiguration(gradleOutputConfig.outletName) => [
250257
outputDirectory = gradleOutputConfig.target.absolutePath
251-
cleanUpDerivedResources = gradleOutputConfig.cleanAutomatically
252-
canClearOutputDirectory = gradleOutputConfig.cleanAutomatically
253-
overrideExistingResources = gradleOutputConfig.cleanAutomatically
254258
]
255259
].toSet
256260
]
@@ -265,24 +269,11 @@ class XtextGradleBuilder implements IncrementalXtextBuilder {
265269
}
266270
]
267271
}
268-
269-
private def attachJavaConfig(XtextResourceSet resourceSet, GradleBuildRequest gradleRequest) {
270-
try {
271-
val configClass = Class.forName("org.eclipse.xtext.java.resource.JavaConfig")
272-
val javaConfig = configClass.newInstance
273-
val javaVersion = JavaVersion.fromQualifier(gradleRequest.generatorConfigsByLanguage.values.head.javaSourceLevel.toString)
274-
configClass.getMethod("attachToEmfObject", Notifier).invoke(javaConfig, resourceSet)
275-
configClass.getMethod("setJavaSourceLevel", JavaVersion).invoke(javaConfig, javaVersion)
276-
configClass.getMethod("setJavaTargetLevel", JavaVersion).invoke(javaConfig, javaVersion)
277-
} catch(ClassNotFoundException ignore) {
278-
// this only exists in Xtext 2.11 and upwards
279-
}
280-
}
281-
272+
282273
override void installDebugInfo(GradleInstallDebugInfoRequest gradleRequest) {
283274
val request = new InstallDebugInfoRequest => [
284275
classesDir = gradleRequest.classesDir
285-
sourceInstallerByFileExtension = gradleRequest.sourceInstallerByFileExtension.mapValues [ gradleConfig |
276+
sourceInstallerByFileExtension = gradleRequest.sourceInstallerByFileExtension.mapValues[gradleConfig|
286277
new SourceInstallerConfig => [
287278
sourceInstaller = SourceInstaller.valueOf(gradleConfig.sourceInstaller.name)
288279
hideSyntheticVariables = gradleConfig.isHideSyntheticVariables

0 commit comments

Comments
 (0)