@@ -12,7 +12,6 @@ import java.net.URLClassLoader
12
12
import java.util.List
13
13
import java.util.Set
14
14
import java.util.concurrent.ConcurrentHashMap
15
- import org.eclipse.emf.common.notify.Notifier
16
15
import org.eclipse.emf.common.util.URI
17
16
import org.eclipse.xtext.ISetup
18
17
import org.eclipse.xtext.build.BuildRequest
@@ -52,7 +51,7 @@ class XtextGradleBuilder implements IncrementalXtextBuilder {
52
51
val sharedInjector = Guice . createInjector
53
52
val incrementalbuilder = sharedInjector. getInstance(IncrementalBuilder )
54
53
val debugInfoInstaller = sharedInjector. getInstance(DebugInfoInstaller )
55
-
54
+
56
55
new (Set<String > setupNames, String encoding) throws Exception {
57
56
System . setProperty(" org.eclipse.emf.common.util.ReferenceClearingQueue" , " false" )
58
57
for (setupName : setupNames) {
@@ -67,12 +66,12 @@ class XtextGradleBuilder implements IncrementalXtextBuilder {
67
66
val containerHandle = gradleRequest. containerHandle
68
67
val validator = new GradleValidatonCallback (gradleRequest. logger)
69
68
val response = new GradleBuildResponse
70
-
69
+
71
70
indexChangedClasspathEntries(gradleRequest)
72
-
71
+
73
72
val request = new BuildRequest = > [
74
73
baseDir = createFolderURI(gradleRequest. projectDir)
75
- if (needsCleanBuild(gradleRequest)) {
74
+ if (needsCleanBuild(gradleRequest)) {
76
75
dirtyFiles = gradleRequest. allFiles. map[URI . createFileURI(absolutePath)]. toList
77
76
state = new IndexState
78
77
} else {
@@ -84,28 +83,28 @@ class XtextGradleBuilder implements IncrementalXtextBuilder {
84
83
}
85
84
86
85
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
+
89
88
preparResourceSet(containerHandle, state. resourceDescriptions, gradleRequest)
90
89
]
91
-
90
+
92
91
val result = doBuild(request, gradleRequest)
93
-
94
- if (! validator. isErrorFree) {
92
+
93
+ if (! validator. isErrorFree) {
95
94
throw new GradleException (" Xtext validation failed, see build log for details." )
96
95
}
97
-
96
+
98
97
val resultingIndex = result. indexState
99
98
index. setContainer(containerHandle, resultingIndex. resourceDescriptions)
100
99
generatedMappings. put(containerHandle, resultingIndex. fileMappings)
101
100
return response
102
101
}
103
-
102
+
104
103
private def indexChangedClasspathEntries (GradleBuildRequest gradleRequest ) {
105
104
val registry = IResourceServiceProvider . Registry . INSTANCE
106
- gradleRequest. dirtyClasspathEntries. filter[exists]. forEach [ dirtyClasspathEntry |
105
+ gradleRequest. dirtyClasspathEntries. filter[exists]. forEach[ dirtyClasspathEntry|
107
106
val hash = hash(dirtyClasspathEntry)
108
- if (dependencyHashes. get(dirtyClasspathEntry) != hash) {
107
+ if (dependencyHashes. get(dirtyClasspathEntry) != hash) {
109
108
val containerHandle = dirtyClasspathEntry. path
110
109
val request = new BuildRequest = > [
111
110
indexOnly = true
@@ -114,128 +113,136 @@ class XtextGradleBuilder implements IncrementalXtextBuilder {
114
113
* Only mark files as dirty that have changed in the jar,
115
114
* detect the deleted ones and reuse the existing index chunk for unchanged ones.
116
115
*/
117
- dirtyFiles + = new PathTraverser (). findAllResourceUris(dirtyClasspathEntry. path) [ uri |
116
+ dirtyFiles + = new PathTraverser (). findAllResourceUris(dirtyClasspathEntry. path) [uri|
118
117
registry. getResourceServiceProvider(uri) !== null
119
118
]
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
+
122
122
val indexChunk = new ResourceDescriptionsData (emptyList)
123
123
val fileMappings = new Source2GeneratedMapping
124
124
state = new IndexState (indexChunk, fileMappings)
125
125
preparResourceSet(containerHandle, indexChunk, gradleRequest)
126
126
]
127
-
127
+
128
128
val result = doBuild(request, gradleRequest)
129
129
val resultingIndex = result. indexState
130
130
index. setContainer(containerHandle, resultingIndex. resourceDescriptions)
131
131
dependencyHashes. put(dirtyClasspathEntry, hash)
132
132
}
133
133
]
134
134
}
135
-
135
+
136
136
private def HashCode hash (File file ) {
137
137
val hasher = Hashing . md5. newHasher
138
138
hash(file, hasher)
139
139
hasher. hash
140
140
}
141
-
141
+
142
142
private def void hash (File file , Hasher hasher ) {
143
- if (file. isDirectory) {
143
+ if (file. isDirectory) {
144
144
file. listFiles. forEach[hash(hasher)]
145
145
} else {
146
146
Files . asByteSource(file). copyTo(Funnels . asOutputStream(hasher))
147
147
}
148
148
}
149
-
149
+
150
150
private def preparResourceSet (BuildRequest it , String containerHandle , ResourceDescriptionsData indexChunk , GradleBuildRequest gradleRequest ) {
151
151
resourceSet = sharedInjector. getInstance(XtextResourceSet ) = > [
152
152
classpathURIContext = gradleRequest. jvmTypesLoader
153
153
attachProjectConfig(gradleRequest)
154
154
attachGeneratorConfig(gradleRequest)
155
155
attachOutputConfig(gradleRequest)
156
156
attachPreferences(gradleRequest)
157
- attachJavaConfig(gradleRequest)
158
157
attachProjectDescription(containerHandle, gradleRequest. allClasspathEntries. map[path]. toList, it )
159
158
val contextualIndex = index. createShallowCopyWith(it )
160
159
contextualIndex. setContainer(containerHandle, indexChunk)
161
160
]
162
161
}
163
-
162
+
164
163
private def doBuild (BuildRequest request , GradleBuildRequest gradleRequest ) {
165
164
try {
166
165
val registry = IResourceServiceProvider . Registry . INSTANCE
167
- if (needsCleanBuild(gradleRequest)) {
166
+ if (needsCleanBuild(gradleRequest)) {
168
167
doClean(gradleRequest)
169
168
}
170
- incrementalbuilder. build(request, [uri|registry. getResourceServiceProvider(uri)])
169
+ incrementalbuilder. build(request, [uri| registry. getResourceServiceProvider(uri)])
171
170
} finally {
172
171
cleanup(gradleRequest, request)
173
172
}
174
173
}
175
-
174
+
176
175
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
+ ]
180
183
}
181
-
184
+
182
185
private def void deleteRecursive (File file ) {
183
- if (file. isDirectory) {
186
+ if (file. isDirectory) {
184
187
file. listFiles. forEach[deleteRecursive]
185
188
}
186
189
file. delete
187
190
}
188
-
191
+
189
192
private def boolean needsCleanBuild (GradleBuildRequest request ) {
190
193
! request. incremental || ! request. dirtyClasspathEntries. isEmpty || index. getContainer(request. containerHandle) == = null
191
194
}
192
-
195
+
193
196
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
+ }
199
202
new URLClassLoader (gradleRequest. allClasspathEntries. map[toURI. toURL], parent)
200
203
}
201
-
204
+
202
205
private def cleanup (GradleBuildRequest gradleRequest , BuildRequest request ) {
203
206
val resourceSet = request. resourceSet
204
207
val jvmTypesLoader = resourceSet. classpathURIContext
205
- if (jvmTypesLoader instanceof Closeable ) {
208
+ if (jvmTypesLoader instanceof Closeable ) {
206
209
try {
207
210
jvmTypesLoader. close
208
- } catch (Exception e) {
211
+ } catch (Exception e) {
209
212
gradleRequest. logger. debug(" Couldn't close jvm types classloader" , e)
210
213
}
211
214
}
212
215
resourceSet. resources. clear
213
216
resourceSet. eAdapters. clear
214
217
}
215
-
218
+
216
219
private def attachProjectConfig (XtextResourceSet resourceSet , GradleBuildRequest gradleRequest ) {
217
220
ProjectConfigAdapter . install(resourceSet, new GradleProjectConfig (gradleRequest))
218
221
}
219
-
222
+
220
223
private def attachProjectDescription (String containerHandle , List<String > dependencies , XtextResourceSet resourceSet ) {
221
224
new ProjectDescription = > [
222
225
name = containerHandle
223
226
it . dependencies = dependencies
224
227
attachToEmfObject(resourceSet)
225
228
]
226
229
}
227
-
230
+
228
231
private def attachGeneratorConfig (XtextResourceSet resourceSet , GradleBuildRequest gradleRequest ) {
229
232
new GeneratorConfigProvider . GeneratorConfigAdapter = > [
230
233
attachToEmfObject(resourceSet)
231
234
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
+ }
233
240
new GeneratorConfig = > [
234
241
generateSyntheticSuppressWarnings = gradleConfig. isGenerateSyntheticSuppressWarnings
235
242
generateGeneratedAnnotation = gradleConfig. isGenerateGeneratedAnnotation
236
- includeDateInGeneratedAnnotation = gradleConfig. isIncludeDateInGeneratedAnnotation
243
+ includeDateInGeneratedAnnotation = gradleConfig. isIncludeDateInGeneratedAnnotation
237
244
generatedAnnotationComment = gradleConfig. generatedAnnotationComment
238
- javaSourceVersion = JavaVersion . fromQualifier(gradleConfig . javaSourceLevel . toString)
245
+ javaSourceVersion = javaVersion ?: JavaVersion . JAVA8
239
246
]
240
247
]
241
248
)
@@ -244,13 +251,10 @@ class XtextGradleBuilder implements IncrementalXtextBuilder {
244
251
245
252
private def attachOutputConfig (XtextResourceSet resourceSet , GradleBuildRequest gradleRequest ) {
246
253
resourceSet. eAdapters + = new OutputConfigurationAdapter (
247
- gradleRequest. generatorConfigsByLanguage. mapValues [
248
- outputConfigs. map [ gradleOutputConfig |
254
+ gradleRequest. generatorConfigsByLanguage. mapValues[
255
+ outputConfigs. map[ gradleOutputConfig|
249
256
new OutputConfiguration (gradleOutputConfig. outletName) = > [
250
257
outputDirectory = gradleOutputConfig. target. absolutePath
251
- cleanUpDerivedResources = gradleOutputConfig. cleanAutomatically
252
- canClearOutputDirectory = gradleOutputConfig. cleanAutomatically
253
- overrideExistingResources = gradleOutputConfig. cleanAutomatically
254
258
]
255
259
]. toSet
256
260
]
@@ -265,24 +269,11 @@ class XtextGradleBuilder implements IncrementalXtextBuilder {
265
269
}
266
270
]
267
271
}
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
+
282
273
override void installDebugInfo (GradleInstallDebugInfoRequest gradleRequest ) {
283
274
val request = new InstallDebugInfoRequest = > [
284
275
classesDir = gradleRequest. classesDir
285
- sourceInstallerByFileExtension = gradleRequest. sourceInstallerByFileExtension. mapValues [ gradleConfig |
276
+ sourceInstallerByFileExtension = gradleRequest. sourceInstallerByFileExtension. mapValues[ gradleConfig|
286
277
new SourceInstallerConfig = > [
287
278
sourceInstaller = SourceInstaller . valueOf(gradleConfig. sourceInstaller. name)
288
279
hideSyntheticVariables = gradleConfig. isHideSyntheticVariables
0 commit comments