From 216ed02571d6169a1d62f47a06e6e9cd8adc5341 Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 14 Oct 2011 13:40:16 +0400 Subject: [PATCH] jps: load some compiler options and annotation processing options from project files --- .../jps/CompilerConfiguration.groovy | 12 ++++- .../jps/idea/IdeaProjectLoader.groovy | 47 +++++++++++++++++-- .../compilerConfiguration.iml | 12 +++++ .../compilerConfiguration.ipr | 40 ++++++++++++++++ .../compilerConfiguration.iws | 8 ++++ .../.idea/compiler.xml | 28 +++++++++++ .../.idea/encodings.xml | 5 ++ .../compilerConfigurationDir/.idea/misc.xml | 7 +++ .../.idea/modules.xml | 9 ++++ .../.idea/workspace.xml | 8 ++++ .../compilerConfiguration.iml | 12 +++++ .../compilerConfiguration.ipr | 37 +++++++++++++++ .../jps/CompilerConfigurationTest.groovy | 41 ++++++++++++++++ .../org/jetbrains/jps/JpsBuildTestCase.groovy | 6 +-- 14 files changed, 263 insertions(+), 9 deletions(-) create mode 100644 jps/testData/compilerConfiguration/compilerConfiguration.iml create mode 100644 jps/testData/compilerConfiguration/compilerConfiguration.ipr create mode 100644 jps/testData/compilerConfiguration/compilerConfiguration.iws create mode 100644 jps/testData/compilerConfigurationDir/.idea/compiler.xml create mode 100644 jps/testData/compilerConfigurationDir/.idea/encodings.xml create mode 100644 jps/testData/compilerConfigurationDir/.idea/misc.xml create mode 100644 jps/testData/compilerConfigurationDir/.idea/modules.xml create mode 100644 jps/testData/compilerConfigurationDir/.idea/workspace.xml create mode 100644 jps/testData/compilerConfigurationDir/compilerConfiguration.iml create mode 100644 jps/testData/compilerConfigurationDir/compilerConfiguration.ipr create mode 100644 jps/testSrc/org/jetbrains/jps/CompilerConfigurationTest.groovy diff --git a/jps/model/src/org/jetbrains/jps/CompilerConfiguration.groovy b/jps/model/src/org/jetbrains/jps/CompilerConfiguration.groovy index b738c994fe5b..90017cf89d26 100644 --- a/jps/model/src/org/jetbrains/jps/CompilerConfiguration.groovy +++ b/jps/model/src/org/jetbrains/jps/CompilerConfiguration.groovy @@ -8,5 +8,15 @@ class CompilerConfiguration { List resourceIncludePatterns = "properties,xml,gif,png,jpeg,jpg,jtml,dtd,tld,ftl".split(",").collect {"**/?*.$it"} List resourceExcludePatterns = [] Map javacOptions = [:] - + boolean clearOutputDirectoryOnRebuild = true + boolean addNotNullAssertions = true + AnnotationProcessingConfiguration annotationProcessing = new AnnotationProcessingConfiguration() } + +class AnnotationProcessingConfiguration { + boolean enabled = false + boolean obtainProcessorsFromClasspath = true + String processorsPath + Map processorsOptions = [:] + Map processModule = [:] +} \ No newline at end of file diff --git a/jps/model/src/org/jetbrains/jps/idea/IdeaProjectLoader.groovy b/jps/model/src/org/jetbrains/jps/idea/IdeaProjectLoader.groovy index 327acd39e774..9e85291295f7 100644 --- a/jps/model/src/org/jetbrains/jps/idea/IdeaProjectLoader.groovy +++ b/jps/model/src/org/jetbrains/jps/idea/IdeaProjectLoader.groovy @@ -105,6 +105,7 @@ public class IdeaProjectLoader { loadProjectLibraries(getComponent(root, "libraryTable")) loadArtifacts(getComponent(root, "ArtifactManager")) loadRunConfigurations(getComponent(root, "ProjectRunConfigurationManager")) + loadWorkspaceConfiguration(new File(iprFile.parentFile, iprFile.name[0..-4]+"iws")) } def loadFromDirectoryBased(File dir) { @@ -125,6 +126,7 @@ public class IdeaProjectLoader { if (compilerXml.exists()) { loadCompilerConfiguration(new XmlParser(false, false).parse(compilerXml)) } + loadWorkspaceConfiguration(new File(dir, "workspace.xml")) Node modulesXmlRoot = new XmlParser(false, false).parse(modulesXml) loadModules(modulesXmlRoot.component[0]) @@ -160,6 +162,15 @@ public class IdeaProjectLoader { } } + private def loadWorkspaceConfiguration(File workspaceFile) { + if (!workspaceFile.exists()) return + + def root = new XmlParser(false, false).parse(workspaceFile) + def options = loadOptions(getComponent(root, "CompilerWorkspaceConfiguration")) + project.compilerConfiguration.addNotNullAssertions = parseBoolean(options["ASSERT_NOT_NULL"], true); + project.compilerConfiguration.clearOutputDirectoryOnRebuild = parseBoolean(options["CLEAR_OUTPUT_DIRECTORY"], true); + } + private def loadCompilerConfiguration(Node root) { def rawPatterns = [] def includePatterns = [] @@ -184,12 +195,42 @@ public class IdeaProjectLoader { configuration.resourcePatterns = rawPatterns; } - def javacComponentTag = getComponent(root, "JavacSettings"); - javacComponentTag?.option?.each {Node optionTag -> - configuration.javacOptions[optionTag."@name"] = optionTag."@value"; + configuration.javacOptions.putAll(loadOptions(getComponent(root, "JavacSettings"))) + + def annotationProcessingTag = componentTag.annotationProcessing + if (annotationProcessingTag != null) { + configuration.annotationProcessing.enabled = parseBoolean(annotationProcessingTag."@enabled", false) + configuration.annotationProcessing.obtainProcessorsFromClasspath = parseBoolean(annotationProcessingTag."@useClasspath", true) + List processorPaths = [] + annotationProcessingTag.processorPath?.each { + processorPaths << projectMacroExpander.expandMacros(it."@value") + } + configuration.annotationProcessing.processorsPath = processorPaths.join(File.pathSeparator) + annotationProcessingTag.processor?.each { + configuration.annotationProcessing.processorsOptions[it."@name"] = it."@options" ?: "" + } + annotationProcessingTag.processModule?.each { + configuration.annotationProcessing.processModule[it."@name"] = it."@generatedDirName" + } } } + private static boolean parseBoolean(Object value, boolean defaultValue) { + if (value instanceof NodeList) { + if (value.isEmpty()) return defaultValue + value = value[0] + } + return value != null ? Boolean.parseBoolean((String)value) : defaultValue + } + + private Map loadOptions(Node optionsTag) { + def result = new HashMap() + optionsTag?.option?.each {Node optionTag -> + result[optionTag."@name"] = optionTag."@value"; + } + return result + } + private String convertPattern(String pattern) { if (pattern.indexOf('/') == -1) { return "**/" + pattern diff --git a/jps/testData/compilerConfiguration/compilerConfiguration.iml b/jps/testData/compilerConfiguration/compilerConfiguration.iml new file mode 100644 index 000000000000..d5c074327501 --- /dev/null +++ b/jps/testData/compilerConfiguration/compilerConfiguration.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/jps/testData/compilerConfiguration/compilerConfiguration.ipr b/jps/testData/compilerConfiguration/compilerConfiguration.ipr new file mode 100644 index 000000000000..1a9720974e7c --- /dev/null +++ b/jps/testData/compilerConfiguration/compilerConfiguration.ipr @@ -0,0 +1,40 @@ + + + + + + + + + + + + http://www.w3.org/1999/xhtml + + + + + + diff --git a/jps/testData/compilerConfiguration/compilerConfiguration.iws b/jps/testData/compilerConfiguration/compilerConfiguration.iws new file mode 100644 index 000000000000..8df8552f2cf0 --- /dev/null +++ b/jps/testData/compilerConfiguration/compilerConfiguration.iws @@ -0,0 +1,8 @@ + + + + + + diff --git a/jps/testData/compilerConfigurationDir/.idea/compiler.xml b/jps/testData/compilerConfigurationDir/.idea/compiler.xml new file mode 100644 index 000000000000..425a6927ff0c --- /dev/null +++ b/jps/testData/compilerConfigurationDir/.idea/compiler.xml @@ -0,0 +1,28 @@ + + + + + + diff --git a/jps/testData/compilerConfigurationDir/.idea/encodings.xml b/jps/testData/compilerConfigurationDir/.idea/encodings.xml new file mode 100644 index 000000000000..e206d70d8595 --- /dev/null +++ b/jps/testData/compilerConfigurationDir/.idea/encodings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/jps/testData/compilerConfigurationDir/.idea/misc.xml b/jps/testData/compilerConfigurationDir/.idea/misc.xml new file mode 100644 index 000000000000..dc7535439d30 --- /dev/null +++ b/jps/testData/compilerConfigurationDir/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/jps/testData/compilerConfigurationDir/.idea/modules.xml b/jps/testData/compilerConfigurationDir/.idea/modules.xml new file mode 100644 index 000000000000..8d836f64b0b9 --- /dev/null +++ b/jps/testData/compilerConfigurationDir/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/jps/testData/compilerConfigurationDir/.idea/workspace.xml b/jps/testData/compilerConfigurationDir/.idea/workspace.xml new file mode 100644 index 000000000000..8df8552f2cf0 --- /dev/null +++ b/jps/testData/compilerConfigurationDir/.idea/workspace.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/jps/testData/compilerConfigurationDir/compilerConfiguration.iml b/jps/testData/compilerConfigurationDir/compilerConfiguration.iml new file mode 100644 index 000000000000..d5c074327501 --- /dev/null +++ b/jps/testData/compilerConfigurationDir/compilerConfiguration.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/jps/testData/compilerConfigurationDir/compilerConfiguration.ipr b/jps/testData/compilerConfigurationDir/compilerConfiguration.ipr new file mode 100644 index 000000000000..9eaae69d3bd8 --- /dev/null +++ b/jps/testData/compilerConfigurationDir/compilerConfiguration.ipr @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + diff --git a/jps/testSrc/org/jetbrains/jps/CompilerConfigurationTest.groovy b/jps/testSrc/org/jetbrains/jps/CompilerConfigurationTest.groovy new file mode 100644 index 000000000000..9ff2464b53f8 --- /dev/null +++ b/jps/testSrc/org/jetbrains/jps/CompilerConfigurationTest.groovy @@ -0,0 +1,41 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * 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 org.jetbrains.jps + +/** + * @author nik + */ +class CompilerConfigurationTest extends JpsBuildTestCase { + public void testLoadFromIpr() { + doTest("testData/compilerConfiguration/compilerConfiguration.ipr") + } + + public void testLoadFromDirectory() { + doTest("testData/compilerConfigurationDir") + } + + private def doTest(final String path) { + Project project = loadProject(path, [:]) + CompilerConfiguration configuration = project.compilerConfiguration + assertFalse(configuration.clearOutputDirectoryOnRebuild) + assertFalse(configuration.addNotNullAssertions) + assertTrue(configuration.annotationProcessing.enabled) + assertFalse(configuration.annotationProcessing.obtainProcessorsFromClasspath) + assertTrue(configuration.annotationProcessing.processorsPath.endsWith("/src")) + assertEquals("a=b c=d", configuration.annotationProcessing.processorsOptions["my.proc"]) + assertEquals("gen", configuration.annotationProcessing.processModule["compilerConfiguration"]) + } +} diff --git a/jps/testSrc/org/jetbrains/jps/JpsBuildTestCase.groovy b/jps/testSrc/org/jetbrains/jps/JpsBuildTestCase.groovy index 8aa4fc289894..42eb232501cf 100644 --- a/jps/testSrc/org/jetbrains/jps/JpsBuildTestCase.groovy +++ b/jps/testSrc/org/jetbrains/jps/JpsBuildTestCase.groovy @@ -66,7 +66,7 @@ abstract class JpsBuildTestCase extends TestCase { binding.includeTool << Jps def project = new GantBasedProject(binding) initGlobal(project) - IdeaProjectLoader.loadFromPath(project, projectPath, pathVariables, null, new AntErrorReporter(binding)) + IdeaProjectLoader.loadFromPath(project, "../community/jps/$projectPath", pathVariables, null, new AntErrorReporter(binding)) return project } @@ -99,7 +99,3 @@ abstract class JpsBuildTestCase extends TestCase { return myTempFiles.createTempFile(); } } - -interface ProjectInitializer { - void init(Project project, ProjectBuilder projectBuilder) -}