diff --git a/translator/src/main/java/com/google/devtools/j2objc/translate/ArrayRewriter.java b/translator/src/main/java/com/google/devtools/j2objc/translate/ArrayRewriter.java index a11e4951a2..140bf03f2f 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/translate/ArrayRewriter.java +++ b/translator/src/main/java/com/google/devtools/j2objc/translate/ArrayRewriter.java @@ -37,15 +37,15 @@ import com.google.devtools.j2objc.types.GeneratedVariableBinding; import com.google.devtools.j2objc.types.IOSMethodBinding; import com.google.devtools.j2objc.types.IOSTypeBinding; +import com.google.devtools.j2objc.util.ElementUtil; import com.google.devtools.j2objc.util.TranslationUtil; import com.google.devtools.j2objc.util.UnicodeUtils; - -import org.eclipse.jdt.core.dom.ITypeBinding; -import org.eclipse.jdt.core.dom.Modifier; - import java.util.List; +import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; import javax.lang.model.type.TypeMirror; +import org.eclipse.jdt.core.dom.ITypeBinding; +import org.eclipse.jdt.core.dom.Modifier; /** * Rewrites array creation into a method invocation on an IOSArray class. @@ -233,25 +233,25 @@ public boolean visit(Assignment node) { @Override public void endVisit(ArrayAccess node) { TypeMirror componentType = node.getTypeMirror(); - TypeMirror iosArrayBinding = typeEnv.resolveArrayType(componentType); + TypeElement iosArrayElement = typeEnv.resolveArrayType(componentType); node.replaceWith(newArrayAccess( - node, componentType, iosArrayBinding, TranslationUtil.isAssigned(node))); + node, componentType, iosArrayElement, TranslationUtil.isAssigned(node))); } private Expression newArrayAccess( - ArrayAccess arrayAccessNode, TypeMirror componentType, TypeMirror iosArrayBinding, + ArrayAccess arrayAccessNode, TypeMirror componentType, TypeElement iosArrayElement, boolean assignable) { - String funcName = iosArrayBinding.toString() + "_Get"; + String funcName = ElementUtil.getName(iosArrayElement) + "_Get"; TypeMirror returnType = componentType; TypeMirror declaredReturnType = - componentType.getKind().isPrimitive() ? componentType : typeEnv.resolveIOSTypeMirror("id"); + componentType.getKind().isPrimitive() ? componentType : typeEnv.getIdTypeMirror(); if (assignable) { funcName += "Ref"; returnType = declaredReturnType = typeEnv.getPointerType(componentType); } - FunctionBinding binding = new FunctionBinding(funcName, declaredReturnType, iosArrayBinding); - binding.addParameters(iosArrayBinding, typeEnv.resolveJavaTypeMirror("int")); + FunctionBinding binding = new FunctionBinding(funcName, declaredReturnType, iosArrayElement); + binding.addParameters(iosArrayElement.asType(), typeEnv.resolveJavaTypeMirror("int")); FunctionInvocation invocation = new FunctionInvocation(binding, returnType); invocation.addArgument(arrayAccessNode.getArray().copy()); invocation.addArgument(arrayAccessNode.getIndex().copy()); @@ -274,10 +274,10 @@ private FunctionInvocation newArrayAssignment( funcName = "IOSObjectArray_SetAndConsume"; value = retainedValue; } - TypeMirror objArrayType = typeEnv.resolveIOSTypeMirror("IOSObjectArray"); - TypeMirror idType = typeEnv.resolveIOSTypeMirror("id"); + TypeElement objArrayType = typeEnv.getObjectArrayElement(); + TypeMirror idType = typeEnv.getIdTypeMirror(); FunctionBinding binding = new FunctionBinding(funcName, idType, objArrayType); - binding.addParameters(objArrayType, typeEnv.resolveJavaTypeMirror("int"), idType); + binding.addParameters(objArrayType.asType(), typeEnv.resolveJavaTypeMirror("int"), idType); FunctionInvocation invocation = new FunctionInvocation(binding, componentType); List args = invocation.getArguments(); args.add(TreeUtil.remove(arrayAccessNode.getArray())); diff --git a/translator/src/main/java/com/google/devtools/j2objc/translate/Autoboxer.java b/translator/src/main/java/com/google/devtools/j2objc/translate/Autoboxer.java index b918163059..2b3ca68eb0 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/translate/Autoboxer.java +++ b/translator/src/main/java/com/google/devtools/j2objc/translate/Autoboxer.java @@ -50,6 +50,7 @@ import com.google.devtools.j2objc.util.BindingUtil; import com.google.devtools.j2objc.util.NameTable; import com.google.devtools.j2objc.util.TranslationUtil; +import com.google.devtools.j2objc.util.TypeUtil; import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.ITypeBinding; @@ -168,7 +169,7 @@ private void rewriteBoxedAssignment(Assignment node) { String funcName = "JreBoxed" + getAssignFunctionName(node.getOperator()) + TranslationUtil.getOperatorFunctionModifier(lhs) + NameTable.capitalize(primitiveType.toString()); - FunctionBinding binding = new FunctionBinding(funcName, type, type); + FunctionBinding binding = new FunctionBinding(funcName, type, TypeUtil.asTypeElement(type)); binding.addParameters(pointerType, primitiveType); FunctionInvocation invocation = new FunctionInvocation(binding, type); invocation.addArgument(new PrefixExpression( @@ -390,7 +391,7 @@ private void rewriteBoxedPrefixOrPostfix(TreeNode node, Expression operand, Stri TypeMirror pointerType = typeEnv.getPointerType(type); funcName = "JreBoxed" + funcName + TranslationUtil.getOperatorFunctionModifier(operand) + NameTable.capitalize(typeEnv.getPrimitiveType(type).toString()); - FunctionBinding binding = new FunctionBinding(funcName, type, type); + FunctionBinding binding = new FunctionBinding(funcName, type, TypeUtil.asTypeElement(type)); binding.addParameters(pointerType); FunctionInvocation invocation = new FunctionInvocation(binding, type); invocation.addArgument(new PrefixExpression( diff --git a/translator/src/main/java/com/google/devtools/j2objc/translate/CastResolver.java b/translator/src/main/java/com/google/devtools/j2objc/translate/CastResolver.java index a495cae4e1..89cad6f227 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/translate/CastResolver.java +++ b/translator/src/main/java/com/google/devtools/j2objc/translate/CastResolver.java @@ -117,7 +117,7 @@ private Expression rewriteFloatToIntegralCast( private FunctionInvocation createCastCheck(ITypeBinding type, Expression expr) { type = type.getErasure(); - TypeMirror idType = typeEnv.resolveIOSTypeMirror("id"); + TypeMirror idType = typeEnv.getIdTypeMirror(); FunctionInvocation invocation = null; if ((type.isInterface() && !type.isAnnotation()) || (type.isArray() && !type.getComponentType().isPrimitive())) { diff --git a/translator/src/main/java/com/google/devtools/j2objc/translate/DefaultMethodShimGenerator.java b/translator/src/main/java/com/google/devtools/j2objc/translate/DefaultMethodShimGenerator.java index 53fd2e82d8..43bdbd6305 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/translate/DefaultMethodShimGenerator.java +++ b/translator/src/main/java/com/google/devtools/j2objc/translate/DefaultMethodShimGenerator.java @@ -224,8 +224,7 @@ private void addDefaultMethodShim(String selector, ExecutablePair method) { // if required. TypeElement declaringClass = ElementUtil.getDeclaringClass(method.elem); String name = nameTable.getFullFunctionName(method.elem); - FunctionBinding fb = new FunctionBinding( - name, method.elem.getReturnType(), declaringClass.asType()); + FunctionBinding fb = new FunctionBinding(name, method.elem.getReturnType(), declaringClass); fb.addParameters(declaringClass.asType()); fb.addParameters(((ExecutableType) method.elem.asType()).getParameterTypes()); FunctionInvocation invocation = new FunctionInvocation(fb, method.type.getReturnType()); diff --git a/translator/src/main/java/com/google/devtools/j2objc/translate/JavaCloneWriter.java b/translator/src/main/java/com/google/devtools/j2objc/translate/JavaCloneWriter.java index 467a6419b2..1248df9396 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/translate/JavaCloneWriter.java +++ b/translator/src/main/java/com/google/devtools/j2objc/translate/JavaCloneWriter.java @@ -111,7 +111,7 @@ private Statement createReleaseStatement(IVariableBinding var) { if (Options.useARC()) { ITypeBinding voidType = typeEnv.resolveJavaType("void"); FunctionBinding binding = new FunctionBinding("JreRelease", voidType, null); - binding.addParameters(typeEnv.resolveIOSTypeMirror("id")); + binding.addParameters(typeEnv.getIdTypeMirror()); FunctionInvocation invocation = new FunctionInvocation(binding, voidType); invocation.addArgument(new SimpleName(var)); return new ExpressionStatement(invocation); diff --git a/translator/src/main/java/com/google/devtools/j2objc/translate/NilCheckResolver.java b/translator/src/main/java/com/google/devtools/j2objc/translate/NilCheckResolver.java index 17a2ce2ee0..56c32d9b6d 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/translate/NilCheckResolver.java +++ b/translator/src/main/java/com/google/devtools/j2objc/translate/NilCheckResolver.java @@ -409,7 +409,7 @@ private void addNilCheck(Expression node) { if (var != null) { addSafeVar(var); } - TypeMirror idType = typeEnv.resolveIOSTypeMirror("id"); + TypeMirror idType = typeEnv.getIdTypeMirror(); FunctionBinding binding = new FunctionBinding("nil_chk", idType, null); binding.addParameters(idType); FunctionInvocation nilChkInvocation = new FunctionInvocation(binding, node.getTypeBinding()); diff --git a/translator/src/main/java/com/google/devtools/j2objc/translate/OperatorRewriter.java b/translator/src/main/java/com/google/devtools/j2objc/translate/OperatorRewriter.java index 1fda56d102..99a5e2bc77 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/translate/OperatorRewriter.java +++ b/translator/src/main/java/com/google/devtools/j2objc/translate/OperatorRewriter.java @@ -150,7 +150,7 @@ private void rewriteVolatileLoad(Expression node) { IVariableBinding var = TreeUtil.getVariableBinding(node); if (var != null && BindingUtil.isVolatile(var) && !TranslationUtil.isAssigned(node)) { TypeMirror type = node.getTypeMirror(); - TypeMirror idType = typeEnv.resolveIOSTypeMirror("id"); + TypeMirror idType = typeEnv.getIdTypeMirror(); TypeMirror declaredType = type.getKind().isPrimitive() ? type : idType; String funcName = "JreLoadVolatile" + NameTable.capitalize(declaredType.toString()); FunctionBinding binding = new FunctionBinding(funcName, declaredType, null); @@ -409,7 +409,7 @@ private void rewriteStringAppend(Assignment node) { List operands = getStringAppendOperands(node); Expression lhs = node.getLeftHandSide(); TypeMirror lhsType = lhs.getTypeMirror(); - TypeMirror idType = typeEnv.resolveIOSTypeMirror("id"); + TypeMirror idType = typeEnv.getIdTypeMirror(); String funcName = "JreStrAppend" + TranslationUtil.getOperatorFunctionModifier(lhs); FunctionBinding binding = new FunctionBinding(funcName, idType, null); binding.addParameters( diff --git a/translator/src/main/java/com/google/devtools/j2objc/translate/SuperMethodInvocationRewriter.java b/translator/src/main/java/com/google/devtools/j2objc/translate/SuperMethodInvocationRewriter.java index bfa4cdb31e..2cfc2d4ab4 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/translate/SuperMethodInvocationRewriter.java +++ b/translator/src/main/java/com/google/devtools/j2objc/translate/SuperMethodInvocationRewriter.java @@ -35,6 +35,7 @@ import com.google.devtools.j2objc.types.FunctionBinding; import com.google.devtools.j2objc.util.BindingUtil; import com.google.devtools.j2objc.util.NameTable; +import com.google.devtools.j2objc.util.TypeUtil; import com.google.devtools.j2objc.util.UnicodeUtils; import org.eclipse.jdt.core.dom.IMethodBinding; @@ -113,7 +114,8 @@ public void endVisit(SuperMethodInvocation node) { // Handle default method invocation: SomeInterface.super.method(...) if (BindingUtil.isDefault(method)) { FunctionBinding binding = new FunctionBinding( - nameTable.getFullFunctionName(method), exprType, typeEnv.getIdTypeMirror()); + nameTable.getFullFunctionName(method), exprType, + BindingConverter.getTypeElement(method.getDeclaringClass())); binding.addParameters(typeEnv.getIdTypeMirror()); binding.addParameters(method.getParameterTypes()); FunctionInvocation invocation = new FunctionInvocation(binding, exprType); @@ -140,7 +142,7 @@ public void endVisit(SuperMethodInvocation node) { superMethods.add(superMethod); FunctionBinding binding = new FunctionBinding( - getSuperFunctionName(superMethod), exprType, qualifierType); + getSuperFunctionName(superMethod), exprType, TypeUtil.asTypeElement(qualifierType)); binding.addParameters(qualifierType, typeEnv.getIdTypeMirror()); binding.addParameters(method.getParameterTypes()); FunctionInvocation invocation = new FunctionInvocation(binding, exprType); diff --git a/translator/src/main/java/com/google/devtools/j2objc/types/FunctionBinding.java b/translator/src/main/java/com/google/devtools/j2objc/types/FunctionBinding.java index 07adfb0a0d..15b5a348e7 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/types/FunctionBinding.java +++ b/translator/src/main/java/com/google/devtools/j2objc/types/FunctionBinding.java @@ -18,6 +18,7 @@ import com.google.devtools.j2objc.jdt.BindingConverter; import java.util.ArrayList; import java.util.List; +import javax.lang.model.element.TypeElement; import javax.lang.model.type.TypeMirror; /** @@ -32,14 +33,13 @@ public class FunctionBinding { // a retained result. private final String retainedResultName; private final TypeMirror returnType; - // TODO(kstanger): This should be and element. - private final TypeMirror declaringClass; + private final TypeElement declaringClass; private List parameterTypes = new ArrayList<>(); private boolean isVarargs = false; public FunctionBinding( String name, String retainedResultName, TypeMirror returnType, - TypeMirror declaringClass) { + TypeElement declaringClass) { this.name = name; this.retainedResultName = retainedResultName; this.returnType = returnType; @@ -49,15 +49,15 @@ public FunctionBinding( public FunctionBinding(String name, String retainedResultName, ITypeBinding returnType, ITypeBinding declaringClass) { this(name, retainedResultName, BindingConverter.getType(returnType), - BindingConverter.getType(declaringClass)); + BindingConverter.getTypeElement(declaringClass)); } public FunctionBinding(String name, ITypeBinding returnType, ITypeBinding declaringClass) { this(name, null, BindingConverter.getType(returnType), - BindingConverter.getType(declaringClass)); + BindingConverter.getTypeElement(declaringClass)); } - public FunctionBinding(String name, TypeMirror returnType, TypeMirror declaringClass) { + public FunctionBinding(String name, TypeMirror returnType, TypeElement declaringClass) { this(name, null, returnType, declaringClass); } @@ -73,7 +73,7 @@ public TypeMirror getReturnType() { return returnType; } - public TypeMirror getDeclaringClass() { + public TypeElement getDeclaringClass() { return declaringClass; } diff --git a/translator/src/main/java/com/google/devtools/j2objc/types/ImplementationImportCollector.java b/translator/src/main/java/com/google/devtools/j2objc/types/ImplementationImportCollector.java index e515ca34e8..daa706da64 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/types/ImplementationImportCollector.java +++ b/translator/src/main/java/com/google/devtools/j2objc/types/ImplementationImportCollector.java @@ -50,17 +50,15 @@ import com.google.devtools.j2objc.ast.VariableDeclarationStatement; import com.google.devtools.j2objc.jdt.BindingConverter; import com.google.devtools.j2objc.util.BindingUtil; - -import org.eclipse.jdt.core.dom.IMethodBinding; -import org.eclipse.jdt.core.dom.ITypeBinding; -import org.eclipse.jdt.core.dom.IVariableBinding; -import org.eclipse.jdt.core.dom.Modifier; - import java.util.Set; - +import javax.lang.model.element.TypeElement; import javax.lang.model.type.ArrayType; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; +import org.eclipse.jdt.core.dom.IMethodBinding; +import org.eclipse.jdt.core.dom.ITypeBinding; +import org.eclipse.jdt.core.dom.IVariableBinding; +import org.eclipse.jdt.core.dom.Modifier; /** * Collects the set of imports needed to resolve type references in an @@ -96,6 +94,12 @@ private void addImports(Type type) { } } + private void addImports(TypeElement type) { + if (type != null) { + addImports(type.asType()); + } + } + private void addImports(TypeMirror type) { Import.addImports(BindingConverter.unwrapTypeMirrorIntoTypeBinding(type), imports, unit); } diff --git a/translator/src/main/java/com/google/devtools/j2objc/types/Types.java b/translator/src/main/java/com/google/devtools/j2objc/types/Types.java index c1aa771e69..686f2147b8 100644 --- a/translator/src/main/java/com/google/devtools/j2objc/types/Types.java +++ b/translator/src/main/java/com/google/devtools/j2objc/types/Types.java @@ -251,10 +251,6 @@ public ITypeBinding resolveIOSType(String name) { return iosBindingMap.get(name); } - public TypeMirror resolveIOSTypeMirror(String name) { - return BindingConverter.getType(iosBindingMap.get(name)); - } - public boolean isJavaObjectType(ITypeBinding type) { return javaObjectType.equals(type); } @@ -280,10 +276,14 @@ public IOSTypeBinding resolveArrayType(ITypeBinding binding) { return arrayBinding != null ? arrayBinding : IOSObjectArray; } - public TypeMirror resolveArrayType(TypeMirror mirror) { + public TypeElement resolveArrayType(TypeMirror mirror) { IOSTypeBinding arrayBinding = arrayBindingMap.get( BindingConverter.unwrapTypeMirrorIntoBinding(mirror)); - return BindingConverter.getType(arrayBinding != null ? arrayBinding : IOSObjectArray); + return BindingConverter.getTypeElement(arrayBinding != null ? arrayBinding : IOSObjectArray); + } + + public TypeElement getObjectArrayElement() { + return BindingConverter.getTypeElement(IOSObjectArray); } public boolean isJavaVoidType(ITypeBinding type) {