build scripts: added @CompileStatic to classes which don't call a lot of AntBuilder dynamic methods

This commit is contained in:
nik
2016-08-04 12:13:32 +03:00
parent ee0c3cc201
commit b5a37db99c
28 changed files with 96 additions and 19 deletions
@@ -15,7 +15,7 @@
*/
package org.jetbrains.intellij.build
import org.codehaus.gant.GantBuilder
import groovy.transform.CompileStatic
import org.jetbrains.intellij.build.impl.BuildContextImpl
import org.jetbrains.intellij.build.impl.BundledJreManager
import org.jetbrains.jps.gant.JpsGantProjectBuilder
@@ -26,6 +26,7 @@ import org.jetbrains.jps.model.module.JpsModule
/**
* @author nik
*/
@CompileStatic
abstract class BuildContext {
AntBuilder ant
BuildMessages messages
@@ -15,9 +15,12 @@
*/
package org.jetbrains.intellij.build
import groovy.transform.CompileStatic
/**
* @author nik
*/
@CompileStatic
abstract class BuildMessageLogger {
abstract void processMessage(LogMessage message)
}
@@ -16,10 +16,12 @@
package org.jetbrains.intellij.build
import com.intellij.util.SystemProperties
import groovy.transform.CompileStatic
/**
* @author nik
*/
@CompileStatic
class BuildOptions {
/**
* By default build scripts compile project classes to a special output directory (to not interfere with the default project output if
@@ -15,12 +15,14 @@
*/
package org.jetbrains.intellij.build
import groovy.transform.CompileStatic
import org.jetbrains.intellij.build.impl.BuildTasksImpl
import org.jetbrains.intellij.build.impl.PluginLayout
/**
* @author nik
*/
@CompileStatic
abstract class BuildTasks {
/**
* Build sources.zip archive containing the project source files keeping the original layout
@@ -15,12 +15,15 @@
*/
package org.jetbrains.intellij.build
import groovy.transform.CompileStatic
import static org.jetbrains.intellij.build.LibraryLicense.jetbrainsLibrary
import static org.jetbrains.intellij.build.LibraryLicense.libraryLicense
/**
* @author nik
*/
@CompileStatic
class CommunityLibraryLicenses {
public static final List<LibraryLicense> LICENSES_LIST = [
libraryLicense(name: "aether-api-0.9.0.M2.jar", version: "0.9.0.M2", libraryNames: ["aether-api-0.9.0.M2.jar"],
@@ -363,5 +366,5 @@ class CommunityLibraryLicenses {
jetbrainsLibrary("tcServiceMessages"),
jetbrainsLibrary("optimizedFileManager.jar"),
jetbrainsLibrary("KotlinJavaRuntime")
]
] as List<LibraryLicense>
}
@@ -33,6 +33,7 @@
package org.jetbrains.intellij.build
import groovy.transform.CompileStatic
import org.jetbrains.intellij.build.impl.PluginLayout
import static org.jetbrains.intellij.build.impl.PluginLayout.plugin
@@ -40,6 +41,7 @@ import static org.jetbrains.intellij.build.impl.PluginLayout.plugin
/**
* @author nik
*/
@CompileStatic
class CommunityRepositoryModules {
static List<String> PLATFORM_API_MODULES = [
"analysis-api",
@@ -15,21 +15,26 @@
*/
package org.jetbrains.intellij.build
import groovy.transform.CompileDynamic
import groovy.transform.CompileStatic
/**
* @author nik
*/
@CompileStatic
class IdeaCommunityProperties extends ProductProperties {
IdeaCommunityProperties(String home) {
baseFileName = "idea"
platformPrefix = "Idea"
productCode = "IC"
applicationInfoModule = "community-resources"
additionalIDEPropertiesFilePaths = ["$home/build/conf/ideaCE.properties"]
additionalIDEPropertiesFilePaths = ["$home/build/conf/ideaCE.properties".toString()]
toolsJarRequired = true
buildCrossPlatformDistribution = true
}
@Override
@CompileDynamic
void copyAdditionalFiles(BuildContext buildContext, String targetDirectory) {
buildContext.ant.copy(todir: targetDirectory) {
fileset(file: "$buildContext.paths.communityHome/LICENSE.txt")
@@ -15,9 +15,12 @@
*/
package org.jetbrains.intellij.build
import groovy.transform.CompileStatic
/**
* @author nik
*/
@CompileStatic
enum JvmArchitecture {
x32(""), x64("64")
@@ -15,9 +15,12 @@
*/
package org.jetbrains.intellij.build
import groovy.transform.CompileStatic
/**
* @author nik
*/
@CompileStatic
abstract class LinuxDistributionCustomizer {
/**
* Path to a 128x128 png product icon for Linux distribution
@@ -15,9 +15,12 @@
*/
package org.jetbrains.intellij.build
import groovy.transform.CompileStatic
/**
* @author nik
*/
@CompileStatic
class LogMessage {
enum Kind {
ERROR, WARNING, INFO, PROGRESS, BLOCK_STARTED, BLOCK_FINISHED
@@ -15,9 +15,12 @@
*/
package org.jetbrains.intellij.build
import groovy.transform.CompileStatic
/**
* @author nik
*/
@CompileStatic
abstract class MacDistributionCustomizer {
/**
* Path to icns file containing product icon bundle for Mac OS distribution
@@ -15,6 +15,8 @@
*/
package org.jetbrains.intellij.build
import groovy.transform.CompileStatic
/**
* @author nik
@@ -40,6 +42,7 @@ package org.jetbrains.intellij.build
* 7. Set environment variable VERSIONER_PERL_PREFER_32_BIT to "true"
* http://apple.stackexchange.com/questions/83109/macosx-10-8-and-32-bit-perl-modules
*/
@CompileStatic
public class MacHostProperties {
/**
* Mac host host name.
@@ -33,11 +33,13 @@
package org.jetbrains.intellij.build
import groovy.transform.CompileStatic
import org.jetbrains.intellij.build.impl.PluginLayout
/**
* @author nik
*/
@CompileStatic
class ProductModulesLayout {
/**
* Name of the main product JAR file. Outputs of {@link #platformImplementationModules} will be packed into it.
@@ -15,9 +15,12 @@
*/
package org.jetbrains.intellij.build
import groovy.transform.CompileStatic
/**
* @author nik
*/
@CompileStatic
public abstract class ProductProperties {
/**
* Base name for script files (*.bat, *.sh, *.exe), usually a shortened product name in lower case (e.g. 'idea' for IntelliJ IDEA, 'datagrip' for DataGrip)
@@ -15,12 +15,15 @@
*/
package org.jetbrains.intellij.build
import groovy.transform.CompileStatic
/**
* Implement this interfaces and pass the implementation to {@link BuildContext#createContext} method to support scrambling the product
* JAR files.
*
* @author nik
*/
@CompileStatic
interface ScrambleTool {
/**
* @return list of modules used by the tool which need to be compiled before {@link #scramble} method is invoked
@@ -30,11 +30,14 @@
*/
package org.jetbrains.intellij.build
import groovy.transform.CompileStatic
/**
* Implement this interfaces and pass the implementation to {@link BuildContext#createContext} method to sign the product's *.exe files.
*
* @author nik
*/
@CompileStatic
interface SignTool {
/**
* @param path absolute path (with '/' as a separator) to *.exe file to be signed
@@ -14,9 +14,13 @@
* limitations under the License.
*/
package org.jetbrains.intellij.build
import groovy.transform.CompileStatic
/**
* @author nik
*/
@CompileStatic
abstract class WindowsDistributionCustomizer {
/**
* Path to 256x256 *.ico file for Windows distribution
@@ -15,6 +15,7 @@
*/
package org.jetbrains.intellij.build.impl
import groovy.transform.CompileStatic
import org.apache.tools.ant.BuildEvent
import org.apache.tools.ant.BuildListener
import org.apache.tools.ant.Project
@@ -24,6 +25,7 @@ import org.jetbrains.intellij.build.BuildMessages
/**
* @author nik
*/
@CompileStatic
class AntTaskLogger implements BuildListener {
BuildMessages defaultHandler
private final Map<Thread, BuildMessages> threadHandlers = [:]
@@ -17,6 +17,8 @@ package org.jetbrains.intellij.build.impl
import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.util.text.StringUtil
import groovy.transform.CompileDynamic
import groovy.transform.CompileStatic
import org.jetbrains.intellij.build.*
import org.jetbrains.jps.gant.JpsGantProjectBuilder
import org.jetbrains.jps.model.JpsGlobal
@@ -26,9 +28,11 @@ import org.jetbrains.jps.model.module.JpsModule
import org.jetbrains.jps.model.serialization.JpsModelSerializationDataService
import org.jetbrains.jps.model.serialization.JpsProjectLoader
import org.jetbrains.jps.util.JpsPathUtil
/**
* @author nik
*/
@CompileStatic
class BuildContextImpl extends BuildContext {
private final JpsGlobal global
private final boolean underTeamCity
@@ -124,10 +128,7 @@ class BuildContextImpl extends BuildContext {
def classesOutput = "$paths.buildOutputRoot/$classesDirName"
List<String> outputDirectoriesToKeep = []
if (options.pathToCompiledClassesArchive != null) {
messages.block("Unpack compiled classes archive") {
FileUtil.delete(new File(classesOutput))
ant.unzip(src: options.pathToCompiledClassesArchive, dest: classesOutput)
}
unpackCompiledClasses(messages, classesOutput, options)
outputDirectoriesToKeep.add(classesDirName)
}
if (options.incrementalCompilation) {
@@ -148,6 +149,14 @@ class BuildContextImpl extends BuildContext {
return outputDirectoriesToKeep
}
@CompileDynamic
private static void unpackCompiledClasses(BuildMessages messages, String classesOutput, BuildOptions options) {
messages.block("Unpack compiled classes archive") {
FileUtil.delete(new File(classesOutput))
ant.unzip(src: options.pathToCompiledClassesArchive, dest: classesOutput)
}
}
private static void checkOptions(BuildOptions options, BuildMessages messages) {
if (options.useCompiledClassesFromProjectOutput && options.incrementalCompilation) {
messages.warning("'${BuildOptions.USE_COMPILED_CLASSES_PROPERTY}' is specified, so 'incremental compilation' option will be ignored")
@@ -15,6 +15,7 @@
*/
package org.jetbrains.intellij.build.impl
import groovy.transform.CompileStatic
import org.apache.tools.ant.BuildException
import org.apache.tools.ant.DefaultLogger
import org.apache.tools.ant.Project
@@ -31,9 +32,10 @@ import java.util.function.Function
/**
* @author nik
*/
@CompileStatic
class BuildMessagesImpl implements BuildMessages {
private final BuildMessageLogger logger
private final Function<String, BuildMessageLogger> loggerFactory
private final Closure<? extends BuildMessageLogger> loggerFactory
private final AntTaskLogger antTaskLogger
private final BuildMessagesImpl parentInstance
private final List<BuildMessagesImpl> forkedInstances = []
@@ -47,9 +49,9 @@ class BuildMessagesImpl implements BuildMessages {
BuildInfoPrinter buildInfoPrinter = underTeamCity ? new TeamCityBuildInfoPrinter() : new DefaultBuildInfoPrinter()
builder.buildInfoPrinter = buildInfoPrinter
disableAntLogging(antProject)
Function<String, BuildMessageLogger> loggerFactory = underTeamCity ? TeamCityBuildMessageLogger.FACTORY : ConsoleBuildMessageLogger.FACTORY
Closure<? extends BuildMessageLogger> loggerFactory = underTeamCity ? TeamCityBuildMessageLogger.FACTORY : ConsoleBuildMessageLogger.FACTORY
def antTaskLogger = new AntTaskLogger()
def messages = new BuildMessagesImpl(loggerFactory.apply(null), loggerFactory, antTaskLogger, null)
def messages = new BuildMessagesImpl(loggerFactory(null), loggerFactory, antTaskLogger, null)
antTaskLogger.defaultHandler = messages
antProject.addBuildListener(antTaskLogger)
antProject.addReference(key, messages)
@@ -67,7 +69,7 @@ class BuildMessagesImpl implements BuildMessages {
}
}
private BuildMessagesImpl(BuildMessageLogger logger, Function<String, BuildMessageLogger> loggerFactory, AntTaskLogger antTaskLogger,
private BuildMessagesImpl(BuildMessageLogger logger, Closure<? extends BuildMessageLogger> loggerFactory, AntTaskLogger antTaskLogger,
BuildMessagesImpl parentInstance) {
this.logger = logger
this.loggerFactory = loggerFactory
@@ -125,7 +127,7 @@ class BuildMessagesImpl implements BuildMessages {
@Override
BuildMessages forkForParallelTask(String taskName) {
def forked = new BuildMessagesImpl(loggerFactory.apply(taskName), loggerFactory, antTaskLogger, this)
def forked = new BuildMessagesImpl(loggerFactory(taskName), loggerFactory, antTaskLogger, this)
forkedInstances << forked
return forked
}
@@ -17,6 +17,7 @@ package org.jetbrains.intellij.build.impl
import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.util.text.StringUtil
import groovy.transform.CompileStatic
import org.apache.tools.ant.Main
import org.apache.tools.ant.Project
import org.codehaus.gant.GantBinding
@@ -24,6 +25,7 @@ import org.codehaus.gant.GantBinding
/**
* @author nik
*/
@CompileStatic
class BuildUtils {
static void addToClassPath(String path, AntBuilder ant) {
def classLoader = (GroovyClassLoader)BuildUtils.class.classLoader
@@ -16,12 +16,15 @@
package org.jetbrains.intellij.build.impl
import com.intellij.openapi.util.SystemInfo
import groovy.transform.CompileDynamic
import groovy.transform.CompileStatic
import org.jetbrains.intellij.build.BuildContext
import org.jetbrains.intellij.build.JvmArchitecture
/**
* @author nik
*/
@CompileStatic
class BundledJreManager {
private final BuildContext buildContext
String baseDirectoryForJre
@@ -62,6 +65,7 @@ class BundledJreManager {
return findJreArchive("mac")?.absolutePath
}
@CompileDynamic
private String extractJre(String osDirName, JvmArchitecture arch = JvmArchitecture.x64, JreVendor vendor = JreVendor.JetBrains) {
String vendorSuffix = vendor == JreVendor.Oracle ? ".oracle" : ""
String targetDir = "$baseDirectoryForJre/jre.$osDirName$arch.fileSuffix$vendorSuffix"
@@ -98,7 +102,7 @@ class BundledJreManager {
def jdkDir = new File(buildContext.paths.projectHome, "build/jdk/$osDirName")
String suffix = arch == JvmArchitecture.x32 ? "_x86" : "_x64"
String prefix = buildContext.productProperties.toolsJarRequired ? vendor.jreWithToolsJarNamePrefix : vendor.jreNamePrefix
def jdkFiles = jdkDir.listFiles().findAll { it.name.startsWith(prefix) && it.name.endsWith("${suffix}.tar.gz") }
Collection<File> jdkFiles = jdkDir.listFiles()?.findAll { it.name.startsWith(prefix) && it.name.endsWith("${suffix}.tar.gz") } ?: [] as List<File>
if (jdkFiles.size() > 1) {
buildContext.messages.warning("Cannot extract $osDirName JRE: several matching files are found ($jdkFiles)")
return null
@@ -15,6 +15,7 @@
*/
package org.jetbrains.intellij.build.impl
import groovy.transform.CompileStatic
import org.jetbrains.intellij.build.BuildMessageLogger
import org.jetbrains.intellij.build.LogMessage
@@ -23,8 +24,9 @@ import java.util.function.Function
/**
* @author nik
*/
@CompileStatic
class ConsoleBuildMessageLogger extends BuildMessageLogger {
public static final Function<String, BuildMessageLogger> FACTORY = { new ConsoleBuildMessageLogger(it) }
public static final Closure<? extends BuildMessageLogger> FACTORY = { String taskName -> new ConsoleBuildMessageLogger(taskName) }
private final String parallelTaskId
private int indent
private static final PrintStream out = BuildUtils.realSystemOut
@@ -17,6 +17,7 @@ package org.jetbrains.intellij.build.impl
import com.intellij.openapi.util.SystemInfo
import com.intellij.util.SystemProperties
import groovy.transform.CompileStatic
import org.jetbrains.intellij.build.BuildMessages
import org.jetbrains.jps.model.JpsGlobal
import org.jetbrains.jps.model.java.JdkVersionDetector
@@ -26,6 +27,7 @@ import org.jetbrains.jps.model.library.JpsOrderRootType
/**
* @author nik
*/
@CompileStatic
class JdkUtils {
public static void defineJdk(JpsGlobal global, String jdkName, String jdkHomePath) {
def sdk = JpsJavaExtensionService.instance.addJavaSdk(global, jdkName, jdkHomePath)
@@ -36,7 +38,7 @@ class JdkUtils {
}
public static String computeJdkHome(BuildMessages messages, String propertyName, String defaultDir, String envVarName) {
def jdkDir = System.getProperty(propertyName)
String jdkDir = System.getProperty(propertyName)
if (jdkDir != null) {
return jdkDir
}
@@ -15,6 +15,7 @@
*/
package org.jetbrains.intellij.build.impl
import groovy.transform.CompileStatic
import org.jetbrains.intellij.build.LibraryLicense
import org.jetbrains.jps.gant.JpsGantProjectBuilder
import org.jetbrains.jps.model.JpsProject
@@ -27,6 +28,7 @@ import org.jetbrains.jps.model.module.JpsModule
/**
* @author nik
*/
@CompileStatic
class LibraryLicensesListGenerator {
private final JpsGantProjectBuilder projectBuilder
private final JpsProject project
@@ -54,7 +56,7 @@ class LibraryLicensesListGenerator {
void generateLicensesTable(String filePath, Set<String> usedModulesNames) {
projectBuilder.info("Generating licenses table")
projectBuilder.info("Used modules: $usedModulesNames")
Set<JpsModule> usedModules = project.modules.findAll { usedModulesNames.contains(it.name) }
Set<JpsModule> usedModules = project.modules.findAll { usedModulesNames.contains(it.name) } as Set<JpsModule>
Map<String, String> usedLibraries = [:]
usedModules.each { JpsModule module ->
JpsJavaExtensionService.dependencies(module).includedIn(JpsJavaClasspathKind.PRODUCTION_RUNTIME).getLibraries().each { item ->
@@ -31,11 +31,13 @@
package org.jetbrains.intellij.build.impl
import com.intellij.openapi.util.io.FileUtil
import groovy.transform.CompileStatic
import java.util.regex.Pattern
/**
* @author nik
*/
@CompileStatic
class NsisFileListGenerator {
private final Map<String, List<File>> directoryToFiles = [:]
private final List<String> filesRelativePaths = []
@@ -15,18 +15,18 @@
*/
package org.jetbrains.intellij.build.impl
import groovy.transform.CompileStatic
import org.jetbrains.intellij.build.BuildMessageLogger
import org.jetbrains.intellij.build.LogMessage
import java.util.function.Function
/**
* todo[nik] this is replacement for BuildInfoPrinter. BuildInfoPrinter should be deleted after we move its remaining methods to this class.
*
* @author nik
*/
@CompileStatic
class TeamCityBuildMessageLogger extends BuildMessageLogger {
public static final Function<String, BuildMessageLogger> FACTORY = { new TeamCityBuildMessageLogger(it) }
public static final Closure<? extends BuildMessageLogger> FACTORY = { String taskName -> new TeamCityBuildMessageLogger(taskName) }
private static final PrintStream out = BuildUtils.realSystemOut
private final String parallelTaskId
@@ -15,11 +15,13 @@
*/
package org.jetbrains.intellij.build.impl
import groovy.transform.CompileStatic
import org.jetbrains.intellij.build.JvmArchitecture
/**
* @author nik
*/
@CompileStatic
class VmOptionsGenerator {
private static final String COMMON_VM_OPTIONS = "-XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -ea " +
"-Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true " +