Skip to content

Commit 9824e89

Browse files
committed
Easy part of CompileStatic migration
If groovy compiles without CompileStatic - code will be compiled in dynamic way, e.g. All type checks will be in runtime. Erased types in bytecode. With CompileStatic - compiler will save all typed in bytecode. If all types saved, we can do static analysis of bytecode with java 8 capability. More details can be found here: google#565 (comment)
1 parent e7f9ab4 commit 9824e89

File tree

8 files changed

+40
-38
lines changed

8 files changed

+40
-38
lines changed

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ dependencies {
6161
implementation 'commons-lang:commons-lang:2.6'
6262

6363
testImplementation 'junit:junit:4.12'
64+
testImplementation "com.android.tools.build:gradle:3.5.0"
6465
testImplementation('org.spockframework:spock-core:1.0-groovy-2.4') {
6566
exclude module: 'groovy-all'
6667
}

src/main/groovy/com/google/protobuf/gradle/ArchiveActionFacade.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,21 @@
2828
*/
2929
package com.google.protobuf.gradle;
3030

31+
import groovy.transform.CompileStatic;
3132
import org.gradle.api.Project;
3233
import org.gradle.api.file.FileTree;
3334
import org.gradle.api.internal.file.FileOperations;
3435

3536
import javax.inject.Inject;
3637

38+
@CompileStatic
3739
public interface ArchiveActionFacade {
3840

3941
FileTree zipTree(Object path);
4042

4143
FileTree tarTree(Object path);
4244

45+
@CompileStatic
4346
class ProjectBased implements ArchiveActionFacade {
4447

4548
private final Project project;
@@ -59,6 +62,7 @@ public FileTree tarTree(Object path) {
5962
}
6063
}
6164

65+
@CompileStatic
6266
abstract class ServiceBased implements ArchiveActionFacade {
6367

6468
// TODO Use public ArchiveOperations from Gradle 6.6 instead

src/main/groovy/com/google/protobuf/gradle/CopyActionFacade.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
*/
3030
package com.google.protobuf.gradle;
3131

32+
import groovy.transform.CompileStatic;
3233
import org.gradle.api.Action;
3334
import org.gradle.api.Project;
3435
import org.gradle.api.file.CopySpec;
@@ -42,9 +43,11 @@
4243
* {@link org.gradle.api.file.FileSystemOperations} if available (Gradle 6.0+) or {@link org.gradle.api.Project#copy} if
4344
* the version of Gradle is below 6.0.
4445
*/
46+
@CompileStatic
4547
interface CopyActionFacade {
4648
WorkResult copy(Action<? super CopySpec> var1);
4749

50+
@CompileStatic
4851
class ProjectBased implements CopyActionFacade {
4952
private final Project project;
5053

@@ -58,6 +61,7 @@ public WorkResult copy(Action<? super CopySpec> action) {
5861
}
5962
}
6063

64+
@CompileStatic
6165
abstract class FileSystemOperationsBased implements CopyActionFacade {
6266
@Inject
6367
public abstract FileSystemOperations getFileSystemOperations();

src/main/groovy/com/google/protobuf/gradle/ExecutableLocator.groovy

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
*/
2929
package com.google.protobuf.gradle
3030

31-
import groovy.transform.CompileDynamic
31+
32+
import groovy.transform.CompileStatic
3233
import org.gradle.api.Named
3334

3435
/**
@@ -37,7 +38,7 @@ import org.gradle.api.Named
3738
* configured, the plugin should try to run the executable from system search
3839
* path.
3940
*/
40-
@CompileDynamic
41+
@CompileStatic
4142
class ExecutableLocator implements Named {
4243

4344
private final String name

src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@
2929
*/
3030
package com.google.protobuf.gradle
3131

32-
import static java.nio.charset.StandardCharsets.US_ASCII
33-
3432
import com.google.common.base.Preconditions
3533
import com.google.common.collect.ImmutableList
3634
import groovy.transform.CompileDynamic
@@ -49,25 +47,14 @@ import org.gradle.api.provider.MapProperty
4947
import org.gradle.api.provider.Property
5048
import org.gradle.api.provider.Provider
5149
import org.gradle.api.provider.ProviderFactory
52-
import org.gradle.api.tasks.CacheableTask
53-
import org.gradle.api.tasks.IgnoreEmptyDirectories
54-
import org.gradle.api.tasks.Input
55-
import org.gradle.api.tasks.InputFiles
56-
import org.gradle.api.tasks.Internal
57-
import org.gradle.api.tasks.Nested
58-
import org.gradle.api.tasks.Optional
59-
import org.gradle.api.tasks.OutputDirectory
60-
import org.gradle.api.tasks.OutputFile
61-
import org.gradle.api.tasks.PathSensitive
62-
import org.gradle.api.tasks.PathSensitivity
63-
import org.gradle.api.tasks.SkipWhenEmpty
64-
import org.gradle.api.tasks.SourceSet
65-
import org.gradle.api.tasks.TaskAction
50+
import org.gradle.api.tasks.*
6651
import org.gradle.util.ConfigureUtil
6752

6853
import javax.annotation.Nullable
6954
import javax.inject.Inject
7055

56+
import static java.nio.charset.StandardCharsets.US_ASCII
57+
7158
/**
7259
* The task that compiles proto files into Java files.
7360
*/

src/main/groovy/com/google/protobuf/gradle/ProtobufConvention.groovy

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,16 @@
2929
*/
3030
package com.google.protobuf.gradle
3131

32-
import groovy.transform.CompileDynamic
32+
33+
import groovy.transform.CompileStatic
3334
import org.gradle.api.Project
3435
import org.gradle.api.internal.file.FileResolver
3536
import org.gradle.util.ConfigureUtil
3637

3738
/**
3839
* Adds the protobuf {} block as a property of the project.
3940
*/
40-
@CompileDynamic
41+
@CompileStatic
4142
class ProtobufConvention {
4243
ProtobufConvention(Project project, FileResolver fileResolver) {
4344
protobuf = new ProtobufConfigurator(project, fileResolver)

src/main/groovy/com/google/protobuf/gradle/ToolsLocator.groovy

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
*/
2929
package com.google.protobuf.gradle
3030

31-
import groovy.transform.CompileDynamic
31+
import com.google.gradle.osdetector.OsDetector
32+
import groovy.transform.CompileStatic
3233
import org.gradle.api.NamedDomainObjectContainer
3334
import org.gradle.api.Project
3435
import org.gradle.api.artifacts.Configuration
@@ -38,12 +39,12 @@ import org.gradle.api.file.FileCollection
3839
/**
3940
* Holds locations of all external executables, i.e., protoc and plugins.
4041
*/
41-
@CompileDynamic
42+
@CompileStatic
4243
class ToolsLocator {
4344

4445
private final Project project
45-
private final ExecutableLocator protoc
46-
private final NamedDomainObjectContainer<ExecutableLocator> plugins
46+
final ExecutableLocator protoc
47+
final NamedDomainObjectContainer<ExecutableLocator> plugins
4748

4849
static List<String> artifactParts(String artifactCoordinate) {
4950
String artifact
@@ -53,11 +54,13 @@ class ToolsLocator {
5354
String version
5455
String classifier
5556

56-
(artifact, extension) = artifactCoordinate.tokenize('@')
57+
def artifactCoordinateTokenized = artifactCoordinate.tokenize('@')
58+
(artifact, extension) = [artifactCoordinateTokenized[0], artifactCoordinateTokenized[1]]
5759
if (extension == null && artifactCoordinate.endsWith('@')) {
5860
extension = ''
5961
}
60-
(group, name, version, classifier) = artifact.tokenize(':')
62+
def artifactTokenized = artifact.tokenize(':')
63+
(group, name, version, classifier) = [artifactTokenized[0], artifactTokenized[1], artifactTokenized[2], artifactTokenized[3]]
6164

6265
return [group, name, version, classifier, extension]
6366
}
@@ -92,19 +95,20 @@ class ToolsLocator {
9295

9396
void registerDependencyWithTasks(ExecutableLocator locator, Collection<GenerateProtoTask> protoTasks) {
9497
// create a project configuration dependency for the artifact
95-
Configuration config = project.configurations.create("protobufToolsLocator_${locator.name}") {
96-
visible = false
97-
transitive = false
98-
extendsFrom = []
98+
Configuration config = project.configurations.create("protobufToolsLocator_${locator.name}") { Configuration conf ->
99+
conf.visible = false
100+
conf.transitive = false
99101
}
100102
String groupId, artifact, version, classifier, extension
101-
(groupId, artifact, version, classifier, extension) = artifactParts(locator.artifact)
103+
def osdetector = project.extensions.getByName("osdetector") as OsDetector
104+
def parts = artifactParts(locator.artifact)
105+
(groupId, artifact, version, classifier, extension) = [parts[0], parts[1], parts[2], parts[3], parts[4]]
102106
Map<String, String> notation = [
103-
group:groupId,
104-
name:artifact,
105-
version:version,
106-
classifier:classifier ?: project.osdetector.classifier,
107-
ext:extension ?: 'exe',
107+
group : groupId,
108+
name : artifact,
109+
version : version,
110+
classifier: classifier ?: osdetector.classifier,
111+
ext : extension ?: 'exe',
108112
]
109113
Dependency dep = project.dependencies.add(config.name, notation)
110114
FileCollection artifactFiles = config.fileCollection(dep)

src/main/groovy/com/google/protobuf/gradle/Utils.groovy

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
package com.google.protobuf.gradle
3030

3131
import com.google.common.base.Preconditions
32-
import groovy.transform.CompileDynamic
32+
import groovy.transform.CompileStatic
3333
import org.apache.commons.lang.StringUtils
3434
import org.gradle.api.GradleException
3535
import org.gradle.api.Project
@@ -43,7 +43,7 @@ import java.util.regex.Matcher
4343
/**
4444
* Utility classes.
4545
*/
46-
@CompileDynamic
46+
@CompileStatic
4747
class Utils {
4848
/**
4949
* Returns the conventional name of a configuration for a sourceSet

0 commit comments

Comments
 (0)