Skip to content

Commit d9ddb26

Browse files
committed
Support multiple file extensions per language
Fixes #71
1 parent 870fc16 commit d9ddb26

File tree

6 files changed

+55
-16
lines changed

6 files changed

+55
-16
lines changed

xtext-gradle-plugin/src/integTest/java/org/xtext/gradle/test/BuildingAPlainLanguageProject.xtend

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.xtext.gradle.test
22

3+
import org.gradle.testkit.runner.TaskOutcome
34
import org.junit.Test
45

56
//TODO use a different language than Xtend
@@ -125,4 +126,17 @@ class BuildingAPlainLanguageProject extends AbstractIntegrationTest {
125126
// then
126127
staleFile.shouldExist
127128
}
129+
130+
/*
131+
* We currently lack a language with multiple file extensions,
132+
* so we test that an empty set will be detected as "no sources"
133+
* to at least have some coverage for the fact that fileExtensions
134+
* is indeed a Set.
135+
*/
136+
@Test
137+
def void canOverrideFileExtensions() {
138+
buildFile << '''xtext.languages.xtend.fileExtensions = []'''
139+
file('src/main/java/HelloWorld.xtend').content = '''class HelloWorld {}'''
140+
build('generateXtext').xtextTask.shouldBe(TaskOutcome.NO_SOURCE)
141+
}
128142
}

xtext-gradle-plugin/src/integTest/java/org/xtext/gradle/test/GradleBuildTester.xtend

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,14 +101,22 @@ class GradleBuildTester extends ExternalResource {
101101
}
102102

103103
def void shouldBeUpToDate(BuildTask task) {
104-
if(task.outcome != TaskOutcome.UP_TO_DATE) {
105-
fail('''Expected task '«task.path»' to be <UP-TO-DATE> but was: <«task.outcome»>''')
104+
task.shouldBe(TaskOutcome.UP_TO_DATE)
105+
}
106+
107+
def void shouldBe(BuildTask task, TaskOutcome outcome) {
108+
if(task.outcome != outcome) {
109+
fail('''Expected task '«task.path»' to be «outcome» but was: <«task.outcome»>''')
106110
}
107111
}
108112

109113
def void shouldNotBeUpToDate(BuildTask task) {
110-
if(task.outcome == TaskOutcome.UP_TO_DATE) {
111-
fail('''Expected task '«task.path»' not to be <UP-TO-DATE> but it was.''')
114+
task.shouldNotBe(TaskOutcome.UP_TO_DATE)
115+
}
116+
117+
def void shouldNotBe(BuildTask task, TaskOutcome outcome) {
118+
if(task.outcome == outcome) {
119+
fail('''Expected task '«task.path»' not to be «outcome» but it was.''')
112120
}
113121
}
114122

xtext-gradle-plugin/src/main/java/org/xtext/gradle/XtendLanguageBasePlugin.xtend

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ class XtendLanguageBasePlugin implements Plugin<Project> {
2626
]
2727
xtext = project.extensions.getByType(XtextExtension)
2828
val xtend = xtext.languages.create("xtend") [
29-
fileExtension = "xtend"
3029
setup = "org.eclipse.xtend.core.XtendStandaloneSetup"
3130
generator.outlet => [
3231
producesJava = true

xtext-gradle-plugin/src/main/java/org/xtext/gradle/XtextBuilderPlugin.xtend

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,9 @@ class XtextBuilderPlugin implements Plugin<Project> {
130130
project.afterEvaluate [
131131
xtext.languages.all [ lang |
132132
xtext.sourceSets.all [
133-
filter.include("**/*." + lang.fileExtension)
133+
lang.fileExtensions.forEach[ ext |
134+
filter.include("**/*." + ext)
135+
]
134136
]
135137
]
136138
]

xtext-gradle-plugin/src/main/java/org/xtext/gradle/tasks/XtextExtension.xtend

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import org.xtext.gradle.tasks.internal.DefaultXtextSourceDirectorySet
2222
import org.xtext.gradle.tasks.internal.Version
2323

2424
import static extension org.xtext.gradle.GradleExtensions.*
25+
import java.util.Set
2526

2627
class XtextExtension {
2728
@Accessors String version
@@ -89,7 +90,7 @@ class XtextExtension {
8990
class Language implements Named {
9091
@Input val String name
9192
@Input String qualifiedName
92-
@Input String fileExtension
93+
@Input Set<String> fileExtensions
9394
@Input String setup
9495
@Nested val GeneratorConfig generator
9596
@Nested val DebuggerConfig debugger
@@ -101,14 +102,22 @@ class Language implements Named {
101102
this.generator = project.instantiate(typeof(GeneratorConfig), project, this)
102103
this.debugger = project.instantiate(typeof(DebuggerConfig))
103104
this.validator = project.instantiate(typeof(ValidatorConfig))
105+
fileExtensions = newLinkedHashSet(name)
104106
}
105107

106108
def getQualifiedName() {
107109
qualifiedName ?: setup.replace("StandaloneSetup", "")
108110
}
109111

112+
@Internal
113+
@Deprecated
110114
def getFileExtension() {
111-
fileExtension ?: name
115+
fileExtensions.head
116+
}
117+
118+
@Deprecated
119+
def setFileExtension(String ext) {
120+
fileExtensions = newLinkedHashSet(ext)
112121
}
113122

114123
def generator(Action<GeneratorConfig> action) {

xtext-gradle-plugin/src/main/java/org/xtext/gradle/tasks/XtextGenerate.xtend

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.xtext.gradle.tasks;
22

33
import com.google.common.base.Charsets
4+
import com.google.common.io.Files
5+
import com.google.common.io.Resources
46
import java.io.File
57
import java.util.Collection
68
import java.util.Set
@@ -18,16 +20,14 @@ import org.gradle.api.tasks.SkipWhenEmpty
1820
import org.gradle.api.tasks.TaskAction
1921
import org.gradle.api.tasks.incremental.IncrementalTaskInputs
2022
import org.gradle.api.tasks.util.PatternSet
23+
import org.xtext.gradle.XtextBuilderPlugin
2124
import org.xtext.gradle.protocol.GradleBuildRequest
2225
import org.xtext.gradle.protocol.GradleGeneratorConfig
2326
import org.xtext.gradle.protocol.GradleInstallDebugInfoRequest
2427
import org.xtext.gradle.protocol.GradleInstallDebugInfoRequest.GradleSourceInstallerConfig
2528
import org.xtext.gradle.protocol.GradleOutputConfig
2629
import org.xtext.gradle.protocol.IncrementalXtextBuilder
2730
import org.xtext.gradle.tasks.internal.IncrementalXtextBuilderProvider
28-
import com.google.common.io.Resources
29-
import org.xtext.gradle.XtextBuilderPlugin
30-
import com.google.common.io.Files
3131

3232
class XtextGenerate extends DefaultTask {
3333

@@ -66,7 +66,9 @@ class XtextGenerate extends DefaultTask {
6666
def getMainSources() {
6767
val patterns = new PatternSet
6868
languages.filter[!generator.outlets.empty].forEach [lang |
69-
patterns.include("**/*." + lang.fileExtension)
69+
lang.fileExtensions.forEach[ ext |
70+
patterns.include("**/*." + ext)
71+
]
7072
]
7173
project.files(sources.srcDirs).asFileTree.matching(patterns)
7274
}
@@ -163,11 +165,16 @@ class XtextGenerate extends DefaultTask {
163165
val request = new GradleInstallDebugInfoRequest => [
164166
generatedJavaFiles = generatedFiles.filter[name.endsWith(".java")].toSet
165167
it.classesDir = classesDir
166-
sourceInstallerByFileExtension = languages.toMap[fileExtension].mapValues[lang|
167-
new GradleSourceInstallerConfig() => [
168-
sourceInstaller = lang.debugger.sourceInstaller
169-
hideSyntheticVariables = lang.debugger.hideSyntheticVariables
168+
sourceInstallerByFileExtension = newLinkedHashMap
169+
170+
languages.forEach[lang|
171+
lang.fileExtensions.forEach[ext |
172+
sourceInstallerByFileExtension.put(ext, new GradleSourceInstallerConfig() => [
173+
sourceInstaller = lang.debugger.sourceInstaller
174+
hideSyntheticVariables = lang.debugger.hideSyntheticVariables
175+
])
170176
]
177+
171178
]
172179
]
173180
builder.installDebugInfo(request)

0 commit comments

Comments
 (0)