Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fbdb3c08 authored by George Mount's avatar George Mount
Browse files

Prepare ClassAnalyzer to be replaced by other implementations.

ClassAnalyzer uses normal reflection. We intend to move
to an Annotation Processor and possibly an Android Studio
plugin version of type interaction as well. This abstracts
the type interaction to prepare.

Change-Id: I2b95ea9074bca7e3053aeadcd3692dffe93b41d6
parent 30bc4d25
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@ import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.annotation.processing.AbstractProcessor;
@@ -23,11 +24,14 @@ import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.Name;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeKind;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
import javax.tools.Diagnostic;
import javax.tools.FileObject;
import javax.tools.JavaFileObject;
+43 −0
Original line number Diff line number Diff line
package com.android.databinding.annotationprocessor;

import android.binding.Bindable;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.io.Writer;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.Name;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeKind;
import javax.tools.Diagnostic;
import javax.tools.FileObject;
import javax.tools.JavaFileObject;
import javax.tools.StandardLocation;

public class ProcessExpressions {

    public static boolean process(ProcessingEnvironment processingEnv,
            Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        return true;
    }
}
+6 −4
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.databinding;

import com.android.databinding.reflection.ReflectionAnalyzer;
import com.android.databinding.reflection.ReflectionClass;
import com.android.databinding.store.SetterStore;
import com.android.databinding.expr.Expr;

@@ -37,15 +39,15 @@ public class Binding {
    }

    public String toJavaCode(String targetViewName, String expressionCode) {
        Class viewType = mTarget.getResolvedType();
        return SetterStore.get(ClassAnalyzer.getInstance()).getSetterCall(mName, viewType,
        ReflectionClass viewType = mTarget.getResolvedType();
        return SetterStore.get(ReflectionAnalyzer.getInstance()).getSetterCall(mName, viewType,
                mExpr.getResolvedType(), targetViewName, expressionCode);
    }

//    private String resolveJavaCode(ClassAnalyzer classAnalyzer) {
//    private String resolveJavaCode(ReflectionAnalyzer reflectionAnalyzer) {
//
//    }
////        return classAnalyzer.findMethod(mTarget.getResolvedType(), mName,
////        return reflectionAnalyzer.findMethod(mTarget.getResolvedType(), mName,
////                Arrays.asList(mExpr.getResolvedType()));
//    //}
//
+5 −5
Original line number Diff line number Diff line
@@ -18,8 +18,8 @@ package com.android.databinding;

import com.android.databinding.expr.Expr;
import com.android.databinding.expr.ExprModel;

import org.w3c.dom.Node;
import com.android.databinding.reflection.ReflectionAnalyzer;
import com.android.databinding.reflection.ReflectionClass;

import java.util.ArrayList;
import java.util.List;
@@ -29,7 +29,7 @@ public class BindingTarget {
    String mViewClass;
    List<Binding> mBindings = new ArrayList<>();
    ExprModel mModel;
    Class mResolvedClass;
    ReflectionClass mResolvedClass;
    String mIncludedLayout;
    // if this target presents itself in multiple layout files with different view types,
    // it receives an interface type and should use it in the getter instead.
@@ -68,9 +68,9 @@ public class BindingTarget {
        return mViewClass;
    }

    public Class getResolvedType() {
    public ReflectionClass getResolvedType() {
        if (mResolvedClass == null) {
            mResolvedClass = ClassAnalyzer.getInstance().findClass(mViewClass);
            mResolvedClass = ReflectionAnalyzer.getInstance().findClass(mViewClass);
        }
        return mResolvedClass;
    }
+18 −11
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import com.google.common.base.Preconditions;

import com.android.databinding.expr.Expr;
import com.android.databinding.expr.ExprModel;
import com.android.databinding.reflection.ReflectionAnalyzer;

import org.antlr.v4.runtime.misc.NotNull;
import org.antlr.v4.runtime.tree.ParseTree;
@@ -78,32 +79,38 @@ public class ExpressionVisitor extends BindingExpressionBaseVisitor<Expr> {
    @Override
    public Expr visitQuestionQuestionOp(@NotNull BindingExpressionParser.QuestionQuestionOpContext ctx) {
        final Expr left = ctx.left.accept(this);
        return mModel.ternary(
                mModel.comparison("==", left, mModel.symbol("null", Object.class)),
        return mModel.ternary(mModel.comparison("==", left, mModel.symbol("null", Object.class)),
                left, ctx.right.accept(this));
    }

    @Override
    public Expr visitTerminal(@NotNull TerminalNode node) {
        final int type = node.getSymbol().getType();
        Class classType;
        switch (type) {
            case BindingExpressionParser.IntegerLiteral:
                return mModel.symbol(node.getText(), Integer.class);
                classType = int.class;
                break;
            case BindingExpressionParser.FloatingPointLiteral:
                return mModel.symbol(node.getText(), Float.class);
                classType = float.class;
                break;
            case BindingExpressionParser.BooleanLiteral:
                return mModel.symbol(node.getText(), Boolean.class);
                classType = boolean.class;
                break;
            case BindingExpressionParser.CharacterLiteral:
                return mModel.symbol(node.getText(), Character.class);
                classType = char.class;
                break;
            case BindingExpressionParser.SingleQuoteString:
                return mModel.symbol(node.getText(), String.class);
            case BindingExpressionParser.DoubleQuoteString:
                return mModel.symbol(node.getText(), String.class);
                classType = String.class;
                break;
            case BindingExpressionParser.NullLiteral:
                return mModel.symbol(node.getText(), Object.class);
                classType = Object.class;
                break;
            default:
                throw new RuntimeException("cannot create expression from terminal node " + node.toString());
        }
        return mModel.symbol(node.getText(), classType);
    }

    @Override
@@ -234,8 +241,8 @@ public class ExpressionVisitor extends BindingExpressionBaseVisitor<Expr> {
//                @org.jetbrains.annotations.NotNull
//                @Override
//                public Class<? extends Object> resolveValueType(
//                        @org.jetbrains.annotations.NotNull ClassAnalyzer classAnalyzer) {
//                    return classAnalyzer.commonParentOf(aggregate.getResolvedClass(), nextResult.getResolvedClass());
//                        @org.jetbrains.annotations.NotNull ReflectionAnalyzer reflectionAnalyzer) {
//                    return reflectionAnalyzer.commonParentOf(aggregate.getResolvedClass(), nextResult.getResolvedClass());
//                }
//
//                @org.jetbrains.annotations.NotNull
Loading