Skip to content

Commit ef7e7a1

Browse files
bcorsoDagger Team
authored and
Dagger Team
committed
Fixes Dagger's shading to properly handle kotlin metadata
The issue was due to incorrect handling of shading in jarjar for kotlin metadata. In particular, jarjar does not replace UTF8 usages in the classfile, so the Strings in the kotlin metadata do not get replaced. This breaks when the class is compiled with kotlinc which uses the kotlin metadata during compilation. To fix this, I've switched from jarjar to using Gradle's shadowJar to do the shading (https://imperceptiblethoughts.com/shadow/). Also, I've added a kotlin regression test in gradle. Closes google#2765 RELNOTES=Fix google#2765: Fixes Dagger's shading to properly handle kotlin metadata. PiperOrigin-RevId: 387123329
1 parent 09087db commit ef7e7a1

File tree

22 files changed

+774
-31
lines changed

22 files changed

+774
-31
lines changed

java/dagger/hilt/android/processor/BUILD

+3-1
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,10 @@ gen_maven_artifact(
9797
javadoc_srcs = [
9898
"//java/dagger/hilt:hilt_processing_filegroup",
9999
],
100+
# The shaded deps are added using jarjar, but they won't be shaded until later
101+
# due to: https://github.com/google/dagger/issues/2765. For the shaded rules see
102+
# util/deploy-hilt.sh
100103
shaded_deps = ["@com_google_auto_auto_common//jar"],
101-
shaded_rules = ["rule com.google.auto.common.** dagger.hilt.android.shaded.auto.common.@1"],
102104
)
103105

104106
filegroup(

java/dagger/hilt/processor/BUILD

+3-1
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,10 @@ gen_maven_artifact(
119119
javadoc_srcs = [
120120
"//java/dagger/hilt:hilt_processing_filegroup",
121121
],
122+
# The shaded deps are added using jarjar, but they won't be shaded until later
123+
# due to: https://github.com/google/dagger/issues/2765. For the shaded rules see
124+
# util/deploy-hilt.sh
122125
shaded_deps = ["@com_google_auto_auto_common//jar"],
123-
shaded_rules = ["rule com.google.auto.common.** dagger.hilt.android.shaded.auto.common.@1"],
124126
)
125127

126128
filegroup(

java/dagger/internal/codegen/BUILD

+3-4
Original file line numberDiff line numberDiff line change
@@ -113,14 +113,13 @@ gen_maven_artifact(
113113
# The javadocs should only include ComponentProcessor.java, since that is the only class used
114114
# externally. Specifically, ComponentProcessor.forTesting() is required for testing SPI plugins.
115115
javadoc_srcs = ["ComponentProcessor.java"],
116+
# The shaded deps are added using jarjar, but they won't be shaded until later
117+
# due to: https://github.com/google/dagger/issues/2765. For the shaded rules see
118+
# util/deploy-dagger.sh
116119
shaded_deps = [
117120
"@com_google_auto_auto_common//jar",
118121
"//java/dagger/internal/codegen/xprocessing",
119122
],
120-
shaded_rules = [
121-
"rule androidx.room.compiler.processing.** dagger.shaded.androidx.room.compiler.processing.@1",
122-
"rule com.google.auto.common.** dagger.shaded.auto.common.@1",
123-
],
124123
)
125124

126125
java_plugin(

java/dagger/spi/BUILD

+3-1
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ gen_maven_artifact(
7777
"dagger.spi",
7878
],
7979
javadoc_srcs = [":spi-srcs"],
80+
# The shaded deps are added using jarjar, but they won't be shaded until later
81+
# due to: https://github.com/google/dagger/issues/2765. For the shaded rules see
82+
# util/deploy-dagger.sh
8083
shaded_deps = ["@com_google_auto_auto_common//jar"],
81-
shaded_rules = ["rule com.google.auto.common.** dagger.spi.shaded.auto.common.@1"],
8284
)

javatests/artifacts/dagger/simple/src/main/java/dagger/simple/SimpleApplication.java

+3
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,8 @@ interface SimpleComponent {
4444

4545
public static void main(String[] args) {
4646
Foo foo = DaggerSimpleApplication_SimpleComponent.create().foo();
47+
48+
// Execute other classes
49+
AssistedInjects.main(args);
4750
}
4851
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*
2+
* Copyright (C) 2020 The Dagger Authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
buildscript {
18+
ext.kotlin_version = "1.5.0"
19+
}
20+
21+
plugins {
22+
id 'application'
23+
id 'org.jetbrains.kotlin.jvm' version "$kotlin_version"
24+
id 'org.jetbrains.kotlin.kapt' version "$kotlin_version"
25+
}
26+
27+
repositories {
28+
google()
29+
mavenCentral()
30+
mavenLocal()
31+
}
32+
33+
java {
34+
// Make sure the generated source is compatible with Java 7.
35+
sourceCompatibility = JavaVersion.VERSION_1_8
36+
}
37+
38+
dependencies {
39+
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
40+
implementation 'com.google.dagger:dagger:LOCAL-SNAPSHOT'
41+
kapt 'com.google.dagger:dagger-compiler:LOCAL-SNAPSHOT'
42+
43+
// This is testImplementation rather than kaptTest because we're actually
44+
// testing the reference to ComponentProcessor.
45+
// See https://github.com/google/dagger/issues/2765
46+
testImplementation 'com.google.dagger:dagger-compiler:LOCAL-SNAPSHOT'
47+
testImplementation 'com.google.truth:truth:1.0.1'
48+
testImplementation 'junit:junit:4.13'
49+
}
50+
51+
application {
52+
mainClass = 'dagger.simple.SimpleApplicationKt'
53+
}
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
distributionBase=GRADLE_USER_HOME
2+
distributionPath=wrapper/dists
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
4+
zipStoreBase=GRADLE_USER_HOME
5+
zipStorePath=wrapper/dists
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
#!/usr/bin/env sh
2+
3+
#
4+
# Copyright 2015 the original author or authors.
5+
#
6+
# Licensed under the Apache License, Version 2.0 (the "License");
7+
# you may not use this file except in compliance with the License.
8+
# You may obtain a copy of the License at
9+
#
10+
# http://www.apache.org/licenses/LICENSE-2.0
11+
#
12+
# Unless required by applicable law or agreed to in writing, software
13+
# distributed under the License is distributed on an "AS IS" BASIS,
14+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
# See the License for the specific language governing permissions and
16+
# limitations under the License.
17+
#
18+
19+
##############################################################################
20+
##
21+
## Gradle start up script for UN*X
22+
##
23+
##############################################################################
24+
25+
# Attempt to set APP_HOME
26+
# Resolve links: $0 may be a link
27+
PRG="$0"
28+
# Need this for relative symlinks.
29+
while [ -h "$PRG" ] ; do
30+
ls=`ls -ld "$PRG"`
31+
link=`expr "$ls" : '.*-> \(.*\)$'`
32+
if expr "$link" : '/.*' > /dev/null; then
33+
PRG="$link"
34+
else
35+
PRG=`dirname "$PRG"`"/$link"
36+
fi
37+
done
38+
SAVED="`pwd`"
39+
cd "`dirname \"$PRG\"`/" >/dev/null
40+
APP_HOME="`pwd -P`"
41+
cd "$SAVED" >/dev/null
42+
43+
APP_NAME="Gradle"
44+
APP_BASE_NAME=`basename "$0"`
45+
46+
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
47+
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
48+
49+
# Use the maximum available, or set MAX_FD != -1 to use that value.
50+
MAX_FD="maximum"
51+
52+
warn () {
53+
echo "$*"
54+
}
55+
56+
die () {
57+
echo
58+
echo "$*"
59+
echo
60+
exit 1
61+
}
62+
63+
# OS specific support (must be 'true' or 'false').
64+
cygwin=false
65+
msys=false
66+
darwin=false
67+
nonstop=false
68+
case "`uname`" in
69+
CYGWIN* )
70+
cygwin=true
71+
;;
72+
Darwin* )
73+
darwin=true
74+
;;
75+
MINGW* )
76+
msys=true
77+
;;
78+
NONSTOP* )
79+
nonstop=true
80+
;;
81+
esac
82+
83+
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
84+
85+
# Determine the Java command to use to start the JVM.
86+
if [ -n "$JAVA_HOME" ] ; then
87+
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
88+
# IBM's JDK on AIX uses strange locations for the executables
89+
JAVACMD="$JAVA_HOME/jre/sh/java"
90+
else
91+
JAVACMD="$JAVA_HOME/bin/java"
92+
fi
93+
if [ ! -x "$JAVACMD" ] ; then
94+
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
95+
96+
Please set the JAVA_HOME variable in your environment to match the
97+
location of your Java installation."
98+
fi
99+
else
100+
JAVACMD="java"
101+
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
102+
103+
Please set the JAVA_HOME variable in your environment to match the
104+
location of your Java installation."
105+
fi
106+
107+
# Increase the maximum file descriptors if we can.
108+
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
109+
MAX_FD_LIMIT=`ulimit -H -n`
110+
if [ $? -eq 0 ] ; then
111+
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
112+
MAX_FD="$MAX_FD_LIMIT"
113+
fi
114+
ulimit -n $MAX_FD
115+
if [ $? -ne 0 ] ; then
116+
warn "Could not set maximum file descriptor limit: $MAX_FD"
117+
fi
118+
else
119+
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
120+
fi
121+
fi
122+
123+
# For Darwin, add options to specify how the application appears in the dock
124+
if $darwin; then
125+
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
126+
fi
127+
128+
# For Cygwin, switch paths to Windows format before running java
129+
if $cygwin ; then
130+
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
131+
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
132+
JAVACMD=`cygpath --unix "$JAVACMD"`
133+
134+
# We build the pattern for arguments to be converted via cygpath
135+
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
136+
SEP=""
137+
for dir in $ROOTDIRSRAW ; do
138+
ROOTDIRS="$ROOTDIRS$SEP$dir"
139+
SEP="|"
140+
done
141+
OURCYGPATTERN="(^($ROOTDIRS))"
142+
# Add a user-defined pattern to the cygpath arguments
143+
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
144+
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
145+
fi
146+
# Now convert the arguments - kludge to limit ourselves to /bin/sh
147+
i=0
148+
for arg in "$@" ; do
149+
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
150+
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
151+
152+
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
153+
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
154+
else
155+
eval `echo args$i`="\"$arg\""
156+
fi
157+
i=$((i+1))
158+
done
159+
case $i in
160+
(0) set -- ;;
161+
(1) set -- "$args0" ;;
162+
(2) set -- "$args0" "$args1" ;;
163+
(3) set -- "$args0" "$args1" "$args2" ;;
164+
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
165+
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
166+
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
167+
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
168+
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
169+
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
170+
esac
171+
fi
172+
173+
# Escape application args
174+
save () {
175+
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
176+
echo " "
177+
}
178+
APP_ARGS=$(save "$@")
179+
180+
# Collect all arguments for the java command, following the shell quoting and substitution rules
181+
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
182+
183+
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
184+
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
185+
cd "$(dirname "$0")"
186+
fi
187+
188+
exec "$JAVACMD" "$@"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*
2+
* Copyright (C) 2021 The Dagger Authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package dagger.simpleKotlin
18+
19+
import dagger.Component
20+
import dagger.assisted.Assisted
21+
import dagger.assisted.AssistedFactory
22+
import dagger.assisted.AssistedInject
23+
import javax.inject.Inject
24+
25+
// This is a regression test for https://github.com/google/dagger/issues/2309
26+
/** A simple, skeletal application that defines an assisted inject binding. */
27+
class AssistedInjects {
28+
@Component
29+
interface MyComponent {
30+
fun fooFactory(): FooFactory
31+
32+
fun parameterizedFooFactory(): ParameterizedFooFactory<Bar, String>
33+
}
34+
35+
class Bar @Inject constructor()
36+
37+
class Foo @AssistedInject constructor(val bar: Bar, @Assisted val str: String)
38+
39+
@AssistedFactory
40+
interface FooFactory {
41+
fun create(str: String): Foo
42+
}
43+
44+
class ParameterizedFoo<T1, T2> @AssistedInject constructor(val t1: T1, @Assisted val t2: T2)
45+
46+
@AssistedFactory
47+
interface ParameterizedFooFactory<T1, T2> {
48+
fun create(t2: T2): ParameterizedFoo<T1, T2>
49+
}
50+
51+
companion object {
52+
// Called from SimpleApplication.main()
53+
fun main() {
54+
val foo: Foo = DaggerAssistedInjects_MyComponent.create().fooFactory().create("")
55+
56+
val parameterizedFoo: ParameterizedFoo<Bar, String> =
57+
DaggerAssistedInjects_MyComponent.create().parameterizedFooFactory().create("")
58+
}
59+
}
60+
}

0 commit comments

Comments
 (0)