diff options
11 files changed, 38 insertions, 116 deletions
@@ -62,7 +62,7 @@ Now you can open extensions in Android Studio. ## Running Android Gradle Plugin Data Binding Tests Some of data binding tests are only in AGP. To run them: -`gw :base:build-system:integration-test:application:te -D:base:build-system:integration-test:application:test.single=DataBinding\*` +`gw :base:build-system:integration-test:databinding:te` ### Running Integration Tests These are run by gradle build. diff --git a/compilationTests/src/test/java/android/databinding/compilationTest/BaseCompilationTest.java b/compilationTests/src/test/java/android/databinding/compilationTest/BaseCompilationTest.java index 16c53986..54e3bb96 100644 --- a/compilationTests/src/test/java/android/databinding/compilationTest/BaseCompilationTest.java +++ b/compilationTests/src/test/java/android/databinding/compilationTest/BaseCompilationTest.java @@ -77,7 +77,7 @@ public class BaseCompilationTest { public TemporaryBuildFolder tmpBuildFolder = new TemporaryBuildFolder(new File("./build", "build-test"), false); - private final boolean mEnableV2; + protected final boolean mEnableV2; File testFolder; diff --git a/compilationTests/src/test/java/android/databinding/compilationTest/SimpleCompilationTest.java b/compilationTests/src/test/java/android/databinding/compilationTest/SimpleCompilationTest.java index bdf780fa..2c64c283 100644 --- a/compilationTests/src/test/java/android/databinding/compilationTest/SimpleCompilationTest.java +++ b/compilationTests/src/test/java/android/databinding/compilationTest/SimpleCompilationTest.java @@ -350,29 +350,6 @@ public class SimpleCompilationTest extends BaseCompilationTest { "and cannot be assigned.", ex.getBareMessage()); } - @SuppressWarnings("deprecated") - @Test - public void testDynamicUtilMembers() throws Throwable { - prepareProject(); - CompilationResult result = runGradle("assembleDebug"); - assertEquals(result.error, 0, result.resultCode); - assertTrue("there should not be any errors " + result.error, - StringUtils.isEmpty(result.error)); - assertTrue("Test sanity, should compile fine", - result.resultContainsText("BUILD SUCCESSFUL")); - File classFile = new File(testFolder, - "app/build/intermediates/classes/debug/android/databinding/DynamicUtil.class"); - assertTrue(classFile.exists()); - - File root = new File(testFolder, "app/build/intermediates/classes/debug/"); - URL[] urls = new URL[] {root.toURL()}; - ClassLoader classLoader = new URLClassLoader(urls, - SimpleCompilationTest.class.getClassLoader()); - Class dynamicUtilClass = classLoader.loadClass("android.databinding.DynamicUtil"); - // ensure it is generated. - MatcherAssert.assertThat(dynamicUtilClass, CoreMatchers.notNullValue()); - } - @Test public void testDependantDoesNotExist() throws Throwable { prepareProject(); diff --git a/compiler/src/main/java/android/databinding/annotationprocessor/ProcessDataBinding.java b/compiler/src/main/java/android/databinding/annotationprocessor/ProcessDataBinding.java index 0a9863e2..13ca86f7 100644 --- a/compiler/src/main/java/android/databinding/annotationprocessor/ProcessDataBinding.java +++ b/compiler/src/main/java/android/databinding/annotationprocessor/ProcessDataBinding.java @@ -127,10 +127,6 @@ public class ProcessDataBinding extends AbstractProcessor { chef.addBRVariables(processBindable); mChef = chef; considerWritingMapper(); - if (mCompilerArgs.isApp() != mCompilerArgs.isTestVariant() || - mCompilerArgs.isEnabledForTests()) { - mChef.writeDynamicUtil(); - } } private void considerWritingMapper() { diff --git a/compiler/src/main/java/android/databinding/tool/CompilerChef.java b/compiler/src/main/java/android/databinding/tool/CompilerChef.java index 24ee1454..363b2b0a 100644 --- a/compiler/src/main/java/android/databinding/tool/CompilerChef.java +++ b/compiler/src/main/java/android/databinding/tool/CompilerChef.java @@ -13,24 +13,18 @@ package android.databinding.tool; -import android.databinding.tool.expr.ExprModel; import android.databinding.tool.processing.Scope; import android.databinding.tool.processing.ScopedException; import android.databinding.tool.reflection.InjectedClass; -import android.databinding.tool.reflection.InjectedMethod; import android.databinding.tool.reflection.ModelAnalyzer; -import android.databinding.tool.reflection.ModelClass; import android.databinding.tool.store.GenClassInfoLog; import android.databinding.tool.store.ResourceBundle; import android.databinding.tool.util.L; -import android.databinding.tool.util.Preconditions; import android.databinding.tool.writer.BRWriter; import android.databinding.tool.writer.BindingMapperWriter; import android.databinding.tool.writer.BindingMapperWriterV2; -import android.databinding.tool.writer.DynamicUtilWriter; import android.databinding.tool.writer.JavaFileWriter; import android.databinding.tool.writer.MergedBindingMapperWriter; - import com.squareup.javapoet.JavaFile; import com.squareup.javapoet.TypeSpec; @@ -39,7 +33,6 @@ import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Set; /** @@ -90,7 +83,6 @@ public class CompilerChef { chef.mResourceBundle.validateMultiResLayouts(); chef.mEnableV2 = compilerArgs.isEnableV2(); chef.pushClassesToAnalyzer(); - chef.pushDynamicUtilToAnalyzer(); return chef; } @@ -166,20 +158,6 @@ public class CompilerChef { } } - public static InjectedClass pushDynamicUtilToAnalyzer() { - InjectedClass injectedClass = new InjectedClass("android.databinding.DynamicUtil", - "java.lang.Object"); - for (Map.Entry<Class, Class> entry : ModelClass.BOX_MAPPING.entrySet()) { - injectedClass.addMethod(new InjectedMethod(injectedClass, true, - ExprModel.SAFE_UNBOX_METHOD_NAME, null, entry.getKey().getCanonicalName(), - entry.getValue().getCanonicalName())); - } - - ModelAnalyzer analyzer = ModelAnalyzer.getInstance(); - analyzer.injectClass(injectedClass); - return injectedClass; - } - public void writeDataBinderMapper(DataBindingCompilerArgs compilerArgs, BRWriter brWriter, List<String> modulePackages) { if (compilerArgs.isEnableV2()) { @@ -265,23 +243,6 @@ public class CompilerChef { } } - public void writeDynamicUtil() { - DynamicUtilWriter dynamicUtil = new DynamicUtilWriter(); - // TODO: Replace this with targetSDK check from plugin - ModelClass versionCodes = ModelAnalyzer.getInstance().findClass( - "android.os.Build.VERSION_CODES", null); - Preconditions.checkNotNull(versionCodes, "Could not find compile SDK"); - int compileVersion = 1; - for (int i = VERSION_CODES.length - 1; i >= 0; i--) { - if (versionCodes.findGetterOrField(VERSION_CODES[i], true) != null) { - compileVersion = i + 1; - break; - } - } - mFileWriter.writeToFile("android.databinding.DynamicUtil", - dynamicUtil.write(compileVersion).generate()); - } - /** * Adds variables to list of Bindables. */ diff --git a/compiler/src/main/java/android/databinding/tool/expr/ExprModel.java b/compiler/src/main/java/android/databinding/tool/expr/ExprModel.java index 0464aa91..53ed1e7d 100644 --- a/compiler/src/main/java/android/databinding/tool/expr/ExprModel.java +++ b/compiler/src/main/java/android/databinding/tool/expr/ExprModel.java @@ -43,7 +43,6 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; public class ExprModel { - static final String DYNAMIC_UTIL = "android.databinding.DynamicUtil"; public static final String SAFE_UNBOX_METHOD_NAME = "safeUnbox"; Map<String, Expr> mExprMap = new HashMap<String, Expr>(); @@ -210,12 +209,6 @@ public class ExprModel { return register(new ViewFieldExpr(bindingTarget)); } - public IdentifierExpr dynamicUtil() { - IdentifierExpr dynamicUtil = staticIdentifier(DYNAMIC_UTIL); - dynamicUtil.setUserDefinedType(DYNAMIC_UTIL); - return dynamicUtil; - } - public IdentifierExpr viewDataBinding() { IdentifierExpr viewDataBinding = staticIdentifier(ModelAnalyzer.VIEW_DATA_BINDING); viewDataBinding.setUserDefinedType(ModelAnalyzer.VIEW_DATA_BINDING); @@ -224,9 +217,9 @@ public class ExprModel { public MethodCallExpr safeUnbox(Expr expr) { ModelClass resolvedType = expr.getResolvedType(); - Preconditions.check(resolvedType.unbox() != resolvedType, ErrorMessages.CANNOT_UNBOX_TYPE, - resolvedType); - MethodCallExpr methodCallExpr = methodCall(dynamicUtil(), SAFE_UNBOX_METHOD_NAME, + Preconditions.check(resolvedType.unbox() != resolvedType, + ErrorMessages.CANNOT_UNBOX_TYPE, resolvedType); + MethodCallExpr methodCallExpr = methodCall(viewDataBinding(), SAFE_UNBOX_METHOD_NAME, Collections.singletonList(expr)); methodCallExpr.setAllowProtected(); for (Location location : expr.getLocations()) { @@ -239,14 +232,14 @@ public class ExprModel { * These are global methods in the expressions. * <p> * To keep this list under control, we validate the method name instead of just resolving to - * DynamicUtil or parent. + * parent. */ public Expr globalMethodCall(String methodName, List<Expr> args) { Preconditions.check(SAFE_UNBOX_METHOD_NAME.equals(methodName), ErrorMessages.CANNOT_FIND_METHOD_ON_OWNER, methodName, "ViewDataBinding"); Preconditions.check(args.size() == 1, ErrorMessages.ARGUMENT_COUNT_MISMATCH, 1, args.size()); - MethodCallExpr expr = methodCall(dynamicUtil(), SAFE_UNBOX_METHOD_NAME, args); + MethodCallExpr expr = methodCall(viewDataBinding(), SAFE_UNBOX_METHOD_NAME, args); expr.setAllowProtected(); return expr; } diff --git a/compiler/src/main/kotlin/android/databinding/tool/writer/DynamicUtilWriter.kt b/compiler/src/main/kotlin/android/databinding/tool/writer/DynamicUtilWriter.kt deleted file mode 100644 index d349f95c..00000000 --- a/compiler/src/main/kotlin/android/databinding/tool/writer/DynamicUtilWriter.kt +++ /dev/null @@ -1,25 +0,0 @@ -package android.databinding.tool.writer; - -import android.databinding.tool.expr.ExprModel -import android.databinding.tool.reflection.ModelAnalyzer -import android.databinding.tool.reflection.ModelClass - -@Suppress("UNUSED_PARAMETER") // TODO remove in a followup CL, this class is not used anymore. -class DynamicUtilWriter { - fun write(targetSdk : kotlin.Int) : KCode = kcode("package android.databinding;") { - nl("") - nl("import android.os.Build.VERSION;") - nl("import android.os.Build.VERSION_CODES;") - nl("import android.databinding.BindingConversion;") - nl("") - annotateWithGenerated() - block("public class DynamicUtil") { - val analyzer = ModelAnalyzer.getInstance(); - ModelClass.UNBOX_MAPPING.forEach { - block("public static ${it.value.simpleName} ${ExprModel.SAFE_UNBOX_METHOD_NAME}(${it.key.canonicalName} boxed)") { - nl("return boxed == null ? ${analyzer.getDefaultValue(it.value.simpleName)} : (${it.value.canonicalName})boxed;"); - } - } - } - } -} diff --git a/compiler/src/test/java/android/databinding/SafeUnboxingTest.java b/compiler/src/test/java/android/databinding/SafeUnboxingTest.java index 9a2cf438..5186ba53 100644 --- a/compiler/src/test/java/android/databinding/SafeUnboxingTest.java +++ b/compiler/src/test/java/android/databinding/SafeUnboxingTest.java @@ -19,32 +19,53 @@ package android.databinding; import android.databinding.tool.CompilerChef; import android.databinding.tool.LayoutBinder; import android.databinding.tool.MockLayoutBinder; -import android.databinding.tool.expr.*; +import android.databinding.tool.expr.BitShiftExpr; +import android.databinding.tool.expr.BracketExpr; +import android.databinding.tool.expr.CastExpr; +import android.databinding.tool.expr.ComparisonExpr; +import android.databinding.tool.expr.Expr; +import android.databinding.tool.expr.ExprModel; +import android.databinding.tool.expr.MathExpr; +import android.databinding.tool.expr.MethodCallExpr; +import android.databinding.tool.expr.TernaryExpr; +import android.databinding.tool.expr.UnaryExpr; import android.databinding.tool.reflection.InjectedClass; import android.databinding.tool.reflection.InjectedMethod; import android.databinding.tool.reflection.ModelAnalyzer; +import android.databinding.tool.reflection.ModelClass; import android.databinding.tool.reflection.java.JavaAnalyzer; +import org.junit.Before; +import org.junit.Test; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import org.junit.Before; -import org.junit.Test; -import static org.junit.Assert.assertTrue; +import java.util.Map; public class SafeUnboxingTest { ExprModel mExprModel; LayoutBinder mLayoutBinder; - IdentifierExpr mDynamicUtil; @Before - public void setUp() throws Exception { + public void setUp() { JavaAnalyzer.initForTests(); mLayoutBinder = new MockLayoutBinder(); mExprModel = mLayoutBinder.getModel(); - mDynamicUtil = mExprModel.dynamicUtil(); - CompilerChef.pushDynamicUtilToAnalyzer(); + createFakeViewDataBinding(); + } + + private void createFakeViewDataBinding() { + InjectedClass injectedClass = new InjectedClass("android.databinding.ViewDataBinding", + "java.lang.Object"); + for (Map.Entry<Class, Class> entry : ModelClass.BOX_MAPPING.entrySet()) { + injectedClass.addMethod(new InjectedMethod(injectedClass, true, + ExprModel.SAFE_UNBOX_METHOD_NAME, null, entry.getKey().getCanonicalName(), + entry.getValue().getCanonicalName())); + } + + ModelAnalyzer analyzer = ModelAnalyzer.getInstance(); + analyzer.injectClass(injectedClass); } @Test @@ -482,7 +503,6 @@ public class SafeUnboxingTest { assertThat(methodCallExpr.getResolvedType().getCanonicalName(), is(replacementReturn)); assertThat(methodCallExpr.getArgs().get(0), is(original)); assertThat(methodCallExpr.getArgs().size(), is(1)); - assertThat(methodCallExpr.getTarget(), is(mDynamicUtil)); } private <T extends Expr> T parse(String input) { diff --git a/compilerCommon/src/main/java/android/databinding/tool/DataBindingBuilder.java b/compilerCommon/src/main/java/android/databinding/tool/DataBindingBuilder.java index 8e0aa78b..62a801c6 100644 --- a/compilerCommon/src/main/java/android/databinding/tool/DataBindingBuilder.java +++ b/compilerCommon/src/main/java/android/databinding/tool/DataBindingBuilder.java @@ -133,7 +133,6 @@ public class DataBindingBuilder { for (String pkg : getBRFilePackages(dataBindingCompilerBuildFolder)) { excludes.add(pkg.replace('.', '/') + "/BR.*"); } - excludes.add("android/databinding/DynamicUtil.class"); if (generatedClassListFile != null) { List<String> generatedClasses = readGeneratedClasses(generatedClassListFile); for (String klass : generatedClasses) { diff --git a/gradlePlugin/src/main/java/android/databinding/tool/DataBindingExcludeGeneratedTask.java b/gradlePlugin/src/main/java/android/databinding/tool/DataBindingExcludeGeneratedTask.java index f311513b..a58d97af 100644 --- a/gradlePlugin/src/main/java/android/databinding/tool/DataBindingExcludeGeneratedTask.java +++ b/gradlePlugin/src/main/java/android/databinding/tool/DataBindingExcludeGeneratedTask.java @@ -88,7 +88,6 @@ public class DataBindingExcludeGeneratedTask extends DefaultTask { exclude(EXCLUDE_PATTERN); if (isLibrary) { exclude(appPkgAsClass + "/BR.*"); - exclude("android/databinding/DynamicUtil.class"); List<String> generatedClasses = readGeneratedClasses(); for (String klass : generatedClasses) { exclude(klass.replace('.', '/') + ".class"); diff --git a/integration-tests/IndependentLibrary/app/src/main/res/layout/included_in_app_from_library.xml b/integration-tests/IndependentLibrary/app/src/main/res/layout/included_in_app_from_library.xml index c7ee78d2..06c83bea 100644 --- a/integration-tests/IndependentLibrary/app/src/main/res/layout/included_in_app_from_library.xml +++ b/integration-tests/IndependentLibrary/app/src/main/res/layout/included_in_app_from_library.xml @@ -20,10 +20,12 @@ <data> <variable name="foo" type="String"/> <variable name="foo2" type="int"/> + <variable name="fooInteger" type="Integer"/> </data> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text='@{foo2 + " " + foo}' android:layout_width="wrap_content" + android:textSize="@{safeUnbox(fooInteger)}" android:layout_height="wrap_content"/> </RelativeLayout> |