Test run fix. Cpp types fix. NameTable.java to NameTableCpp.java rename
This commit is contained in:
parent
3869e78d97
commit
98319a2d73
7 changed files with 182 additions and 96 deletions
|
@ -40,7 +40,7 @@ import com.google.common.base.Charsets;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.io.CharStreams;
|
import com.google.common.io.CharStreams;
|
||||||
import com.google.common.io.Files;
|
import com.google.common.io.Files;
|
||||||
import com.google.devtools.j2cpp.util.NameTable;
|
import com.google.devtools.j2objc.util.NameTable;
|
||||||
import com.google.devtools.j2objc.Options;
|
import com.google.devtools.j2objc.Options;
|
||||||
import com.google.devtools.j2objc.Plugin;
|
import com.google.devtools.j2objc.Plugin;
|
||||||
import com.google.devtools.j2objc.gen.ObjectiveCHeaderGenerator;
|
import com.google.devtools.j2objc.gen.ObjectiveCHeaderGenerator;
|
||||||
|
|
|
@ -26,7 +26,7 @@ import org.eclipse.jface.text.Document;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.io.Files;
|
import com.google.common.io.Files;
|
||||||
import com.google.devtools.j2cpp.util.NameTable;
|
import com.google.devtools.j2objc.util.NameTable;
|
||||||
import com.google.devtools.j2objc.J2ObjC;
|
import com.google.devtools.j2objc.J2ObjC;
|
||||||
import com.google.devtools.j2objc.Options;
|
import com.google.devtools.j2objc.Options;
|
||||||
import com.google.devtools.j2objc.gen.ObjectiveCHeaderGenerator;
|
import com.google.devtools.j2objc.gen.ObjectiveCHeaderGenerator;
|
||||||
|
|
|
@ -9,7 +9,7 @@ import org.eclipse.jdt.core.dom.CompilationUnit;
|
||||||
|
|
||||||
import com.google.common.io.Files;
|
import com.google.common.io.Files;
|
||||||
import com.google.devtools.j2cpp.gen.CppHeaderGenerator;
|
import com.google.devtools.j2cpp.gen.CppHeaderGenerator;
|
||||||
import com.google.devtools.j2objc.J2ObjC.Language;
|
//import com.google.devtools.j2objc.J2ObjC.Language;
|
||||||
//import com.google.devtools.j2objc.gen.ObjectiveCImplementationGenerator;
|
//import com.google.devtools.j2objc.gen.ObjectiveCImplementationGenerator;
|
||||||
|
|
||||||
public abstract class CppGenerationTest extends GenerationTest {
|
public abstract class CppGenerationTest extends GenerationTest {
|
||||||
|
|
|
@ -20,14 +20,14 @@ package com.google.devtools.j2cpp;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.io.Files;
|
import com.google.common.io.Files;
|
||||||
|
|
||||||
import com.google.devtools.j2objc.J2ObjC;
|
import com.google.devtools.j2objc.J2ObjC;
|
||||||
import com.google.devtools.j2objc.Options;
|
|
||||||
import com.google.devtools.j2objc.J2ObjC.Language;
|
import com.google.devtools.j2objc.J2ObjC.Language;
|
||||||
|
import com.google.devtools.j2objc.Options;
|
||||||
import com.google.devtools.j2objc.gen.ObjectiveCHeaderGenerator;
|
import com.google.devtools.j2objc.gen.ObjectiveCHeaderGenerator;
|
||||||
import com.google.devtools.j2objc.gen.ObjectiveCImplementationGenerator;
|
import com.google.devtools.j2objc.gen.ObjectiveCImplementationGenerator;
|
||||||
import com.google.devtools.j2objc.gen.SourceBuilder;
|
import com.google.devtools.j2objc.gen.SourceBuilder;
|
||||||
import com.google.devtools.j2objc.gen.StatementGenerator;
|
import com.google.devtools.j2objc.gen.StatementGenerator;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
import org.eclipse.jdt.core.compiler.IProblem;
|
import org.eclipse.jdt.core.compiler.IProblem;
|
||||||
|
|
|
@ -31,7 +31,7 @@ import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import com.google.common.collect.Multimap;
|
import com.google.common.collect.Multimap;
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
import com.google.devtools.j2cpp.util.NameTable;
|
import com.google.devtools.j2objc.util.NameTable;
|
||||||
import com.google.devtools.j2objc.J2ObjC;
|
import com.google.devtools.j2objc.J2ObjC;
|
||||||
import com.google.devtools.j2objc.Options;
|
import com.google.devtools.j2objc.Options;
|
||||||
import com.google.devtools.j2objc.types.HeaderImportCollector;
|
import com.google.devtools.j2objc.types.HeaderImportCollector;
|
||||||
|
@ -411,7 +411,7 @@ public class CppHeaderGenerator extends CppSourceFileGenerator{
|
||||||
|
|
||||||
private void printInstanceVariables(FieldDeclaration[] fields) {
|
private void printInstanceVariables(FieldDeclaration[] fields) {
|
||||||
indent();
|
indent();
|
||||||
String lastAccess = "@protected";
|
String lastAccess = "protected";
|
||||||
for (FieldDeclaration field : fields) {
|
for (FieldDeclaration field : fields) {
|
||||||
if ((field.getModifiers() & Modifier.STATIC) == 0) {
|
if ((field.getModifiers() & Modifier.STATIC) == 0) {
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
|
@ -433,14 +433,14 @@ public class CppHeaderGenerator extends CppSourceFileGenerator{
|
||||||
print("__weak ");
|
print("__weak ");
|
||||||
}
|
}
|
||||||
ITypeBinding varType = Types.getTypeBinding(vars.get(0));
|
ITypeBinding varType = Types.getTypeBinding(vars.get(0));
|
||||||
String objcType = NameTable.javaRefToObjC(varType);
|
String cppType = NameTable.javaRefToObjC(varType);
|
||||||
boolean needsAsterisk = !varType.isPrimitive() && !objcType.matches("id|id<.*>|Class");
|
boolean needsAsterisk = !varType.isPrimitive() && !cppType.matches("id|id<.*>|Class");
|
||||||
if (needsAsterisk && objcType.endsWith(" *")) {
|
if (needsAsterisk && cppType.endsWith(" *")) {
|
||||||
// Strip pointer from type, as it will be added when appending fragment.
|
// Strip pointer from type, as it will be added when appending fragment.
|
||||||
// This is necessary to create "Foo *one, *two;" declarations.
|
// This is necessary to create "Foo *one, *two;" declarations.
|
||||||
objcType = objcType.substring(0, objcType.length() - 2);
|
cppType = cppType.substring(0, cppType.length() - 2);
|
||||||
}
|
}
|
||||||
print(objcType);
|
print(cppType);
|
||||||
print(' ');
|
print(' ');
|
||||||
for (Iterator<?> it = field.fragments().iterator(); it.hasNext(); ) {
|
for (Iterator<?> it = field.fragments().iterator(); it.hasNext(); ) {
|
||||||
VariableDeclarationFragment f = (VariableDeclarationFragment) it.next();
|
VariableDeclarationFragment f = (VariableDeclarationFragment) it.next();
|
||||||
|
@ -459,45 +459,6 @@ public class CppHeaderGenerator extends CppSourceFileGenerator{
|
||||||
unindent();
|
unindent();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void printProperties(FieldDeclaration[] fields) {
|
|
||||||
int nPrinted = 0;
|
|
||||||
for (FieldDeclaration field : fields) {
|
|
||||||
if ((field.getModifiers() & Modifier.STATIC) == 0) {
|
|
||||||
ITypeBinding type = Types.getTypeBinding(field.getType());
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
List<VariableDeclarationFragment> vars = field.fragments(); // safe by definition
|
|
||||||
for (VariableDeclarationFragment var : vars) {
|
|
||||||
if (var.getName().getIdentifier().startsWith("this$") && superDefinesVariable(var)) {
|
|
||||||
// Don't print, as it shadows an inner field in a super class.
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
print("@property (nonatomic, ");
|
|
||||||
IVariableBinding varBinding = Types.getVariableBinding(var);
|
|
||||||
if (type.isPrimitive()) {
|
|
||||||
print("assign");
|
|
||||||
} else if (Types.isWeakReference(varBinding) ||
|
|
||||||
(varBinding.getName().startsWith("this$") &&
|
|
||||||
Types.hasWeakAnnotation(varBinding.getDeclaringClass()))) {
|
|
||||||
print(Options.useARC() ? "weak" : "assign");
|
|
||||||
} else if (type.isEqualTo(Types.getNSString())) {
|
|
||||||
print("copy");
|
|
||||||
} else {
|
|
||||||
print(Options.useARC() ? "strong" : "retain");
|
|
||||||
}
|
|
||||||
String typeString = NameTable.javaRefToObjC(type);
|
|
||||||
if (!typeString.endsWith("*")) {
|
|
||||||
typeString += " ";
|
|
||||||
}
|
|
||||||
println(String.format(") %s%s;", typeString, NameTable.getName(var.getName())));
|
|
||||||
nPrinted++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (nPrinted > 0) {
|
|
||||||
newline();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void printConstantDefines(AbstractTypeDeclaration node) {
|
private void printConstantDefines(AbstractTypeDeclaration node) {
|
||||||
ITypeBinding type = Types.getTypeBinding(node);
|
ITypeBinding type = Types.getTypeBinding(node);
|
||||||
boolean hadConstant = false;
|
boolean hadConstant = false;
|
||||||
|
@ -583,17 +544,17 @@ public class CppHeaderGenerator extends CppSourceFileGenerator{
|
||||||
if (Options.inlineFieldAccess()) {
|
if (Options.inlineFieldAccess()) {
|
||||||
// Need direct access to fields possibly from inner classes that are
|
// Need direct access to fields possibly from inner classes that are
|
||||||
// promoted to top level classes, so must make all fields public.
|
// promoted to top level classes, so must make all fields public.
|
||||||
return "@public";
|
return "public";
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((modifiers & Modifier.PUBLIC) > 0) {
|
if ((modifiers & Modifier.PUBLIC) > 0) {
|
||||||
return "@public";
|
return "public";
|
||||||
}
|
}
|
||||||
if ((modifiers & Modifier.PROTECTED) > 0) {
|
if ((modifiers & Modifier.PROTECTED) > 0) {
|
||||||
return "@protected";
|
return "protected";
|
||||||
}
|
}
|
||||||
if ((modifiers & Modifier.PRIVATE) > 0) {
|
if ((modifiers & Modifier.PRIVATE) > 0) {
|
||||||
return "@private";
|
return "private";
|
||||||
}
|
}
|
||||||
return "@package";
|
return "@package";
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,8 @@ import org.eclipse.jdt.core.dom.TypeDeclaration;
|
||||||
import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
|
import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.devtools.j2cpp.util.NameTable;
|
import com.google.devtools.j2cpp.util.NameTableCpp;
|
||||||
|
import com.google.devtools.j2objc.util.NameTable;
|
||||||
import com.google.devtools.j2objc.gen.SourceFileGenerator;
|
import com.google.devtools.j2objc.gen.SourceFileGenerator;
|
||||||
import com.google.devtools.j2objc.types.IOSMethod;
|
import com.google.devtools.j2objc.types.IOSMethod;
|
||||||
import com.google.devtools.j2objc.types.IOSParameter;
|
import com.google.devtools.j2objc.types.IOSParameter;
|
||||||
|
@ -124,7 +125,7 @@ public abstract class CppSourceFileGenerator extends SourceFileGenerator {
|
||||||
baseDeclaration = "- (NSUInteger)hash";
|
baseDeclaration = "- (NSUInteger)hash";
|
||||||
} else {
|
} else {
|
||||||
baseDeclaration = String.format("%s (%s)%s", isStatic ? "static" : "",
|
baseDeclaration = String.format("%s (%s)%s", isStatic ? "static" : "",
|
||||||
NameTable.javaRefToCpp(method.getReturnType2()), mappedMethod.getName());
|
NameTableCpp.javaRefToObjC(method.getReturnType2()), mappedMethod.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
sb.append(baseDeclaration);
|
sb.append(baseDeclaration);
|
||||||
|
@ -163,7 +164,7 @@ public abstract class CppSourceFileGenerator extends SourceFileGenerator {
|
||||||
boolean isStatic = Modifier.isStatic(m.getModifiers());
|
boolean isStatic = Modifier.isStatic(m.getModifiers());
|
||||||
IMethodBinding binding = Types.getMethodBinding(m);
|
IMethodBinding binding = Types.getMethodBinding(m);
|
||||||
String methodName = NameTable.getName(binding);
|
String methodName = NameTable.getName(binding);
|
||||||
String baseDeclaration = String.format("\t %s %s %s", isStatic ? "static " : "", NameTable.javaRefToCpp(m.getReturnType2()), methodName);
|
String baseDeclaration = String.format("\t %s %s %s", isStatic ? "static " : "", NameTableCpp.javaRefToObjC(m.getReturnType2()), methodName);
|
||||||
sb.append(baseDeclaration);
|
sb.append(baseDeclaration);
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
List<SingleVariableDeclaration> params = m.parameters(); // safe by definition
|
List<SingleVariableDeclaration> params = m.parameters(); // safe by definition
|
||||||
|
@ -204,7 +205,7 @@ public abstract class CppSourceFileGenerator extends SourceFileGenerator {
|
||||||
boolean isTypeVariable = typeBinding.isTypeVariable();
|
boolean isTypeVariable = typeBinding.isTypeVariable();
|
||||||
String type = isTypeVariable ?
|
String type = isTypeVariable ?
|
||||||
NameTable.getParameterTypeName(NameTable.ID_TYPE, typeBinding) :
|
NameTable.getParameterTypeName(NameTable.ID_TYPE, typeBinding) :
|
||||||
NameTable.getParameterTypeName(NameTable.javaTypeToCpp(param.getType(), true), typeBinding);
|
NameTable.getParameterTypeName(NameTable.javaTypeToObjC(param.getType(), true), typeBinding);
|
||||||
sb.append(" ").append(type).append(" ").append(fieldName);
|
sb.append(" ").append(type).append(" ").append(fieldName);
|
||||||
if (i<nParams-1) {
|
if (i<nParams-1) {
|
||||||
sb.append(",");
|
sb.append(",");
|
||||||
|
@ -240,11 +241,6 @@ public abstract class CppSourceFileGenerator extends SourceFileGenerator {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String parameterKeyword(Type type, ITypeBinding typeBinding) {
|
|
||||||
String typeName = NameTable.javaTypeToCpp(type, true);
|
|
||||||
return parameterKeyword(typeName, typeBinding);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a parameter name, which consists of a prefix ("with") and
|
* Returns a parameter name, which consists of a prefix ("with") and
|
||||||
* a type name that doesn't conflict with core names. For example,
|
* a type name that doesn't conflict with core names. For example,
|
||||||
|
@ -281,38 +277,6 @@ public abstract class CppSourceFileGenerator extends SourceFileGenerator {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a function declaration string from a specified class and method.
|
|
||||||
*/
|
|
||||||
protected String makeFunctionDeclaration(AbstractTypeDeclaration cls,
|
|
||||||
MethodDeclaration method) {
|
|
||||||
StringBuffer sb = new StringBuffer();
|
|
||||||
Type returnType = method.getReturnType2();
|
|
||||||
ITypeBinding binding = Types.getTypeBinding(returnType);
|
|
||||||
if (binding.isEnum()) {
|
|
||||||
sb.append(NameTable.javaTypeToCpp(returnType, true));
|
|
||||||
} else {
|
|
||||||
sb.append(NameTable.javaRefToCpp(returnType));
|
|
||||||
}
|
|
||||||
sb.append(' ');
|
|
||||||
sb.append(NameTable.makeFunctionName(cls, method));
|
|
||||||
sb.append('(');
|
|
||||||
for (Iterator<?> iterator = method.parameters().iterator(); iterator.hasNext(); ) {
|
|
||||||
Object o = iterator.next();
|
|
||||||
if (o instanceof SingleVariableDeclaration) {
|
|
||||||
SingleVariableDeclaration param = (SingleVariableDeclaration) o;
|
|
||||||
String fieldType = NameTable.javaRefToCpp(param.getType());
|
|
||||||
String fieldName = param.getName().getIdentifier();
|
|
||||||
sb.append(String.format("%s %s", fieldType, fieldName));
|
|
||||||
if (iterator.hasNext()) {
|
|
||||||
sb.append(", ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sb.append(')');
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if a superclass also defines this variable.
|
* Returns true if a superclass also defines this variable.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -0,0 +1,161 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2011 Google Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.google.devtools.j2cpp.util;
|
||||||
|
|
||||||
|
import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
|
||||||
|
import org.eclipse.jdt.core.dom.ArrayType;
|
||||||
|
import org.eclipse.jdt.core.dom.IMethodBinding;
|
||||||
|
import org.eclipse.jdt.core.dom.IPackageBinding;
|
||||||
|
import org.eclipse.jdt.core.dom.ITypeBinding;
|
||||||
|
import org.eclipse.jdt.core.dom.ParameterizedType;
|
||||||
|
import org.eclipse.jdt.core.dom.PrimitiveType;
|
||||||
|
import org.eclipse.jdt.core.dom.Type;
|
||||||
|
|
||||||
|
import com.google.devtools.j2objc.types.Types;
|
||||||
|
import com.google.devtools.j2objc.util.NameTable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Singleton service for type/method/variable name support.
|
||||||
|
*
|
||||||
|
* @author Tom Ball
|
||||||
|
*/
|
||||||
|
public class NameTableCpp {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the Objective-C equivalent name for a Java primitive type.
|
||||||
|
*/
|
||||||
|
public static String primitiveTypeToObjC(PrimitiveType type) {
|
||||||
|
PrimitiveType.Code code = type.getPrimitiveTypeCode();
|
||||||
|
return primitiveTypeToObjC(code.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String primitiveTypeToObjC(String javaName) {
|
||||||
|
if (javaName.equals("boolean")) {
|
||||||
|
return "bool"; // defined in NSObject.h
|
||||||
|
}
|
||||||
|
if (javaName.equals("byte")) {
|
||||||
|
// TODO change to appropriate type
|
||||||
|
return "signed short";
|
||||||
|
}
|
||||||
|
if (javaName.equals("char")) {
|
||||||
|
return "wchar_t";
|
||||||
|
}
|
||||||
|
if (javaName.equals("short")) {
|
||||||
|
return "signed short";
|
||||||
|
}
|
||||||
|
if (javaName.equals("long")) {
|
||||||
|
return "signed long";
|
||||||
|
}
|
||||||
|
if (javaName.equals("float")) {
|
||||||
|
return "float";
|
||||||
|
}
|
||||||
|
if (javaName.equals("double")) {
|
||||||
|
return "double";
|
||||||
|
}
|
||||||
|
// type name unchanged for int, float, double, and void
|
||||||
|
return javaName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a Java type into an equivalent Objective-C type.
|
||||||
|
*/
|
||||||
|
public static String javaTypeToObjC(Type type, boolean includeInterfaces) {
|
||||||
|
if (type instanceof PrimitiveType) {
|
||||||
|
return primitiveTypeToObjC((PrimitiveType) type);
|
||||||
|
}
|
||||||
|
if (type instanceof ParameterizedType) {
|
||||||
|
type = ((ParameterizedType) type).getType(); // erase parameterized type
|
||||||
|
}
|
||||||
|
if (type instanceof ArrayType) {
|
||||||
|
ITypeBinding arrayBinding = Types.getTypeBinding(type);
|
||||||
|
if (arrayBinding != null) {
|
||||||
|
ITypeBinding elementType = arrayBinding.getElementType();
|
||||||
|
return Types.resolveArrayType(elementType).getName();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ITypeBinding binding = Types.getTypeBinding(type);
|
||||||
|
return javaTypeToObjC(binding, includeInterfaces);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String javaTypeToObjC(ITypeBinding binding, boolean includeInterfaces) {
|
||||||
|
if (binding.isInterface() && !includeInterfaces || binding == Types.resolveIOSType("id") ||
|
||||||
|
binding == Types.resolveIOSType("NSObject")) {
|
||||||
|
return NameTable.ID_TYPE;
|
||||||
|
}
|
||||||
|
if (binding.isTypeVariable()) {
|
||||||
|
binding = binding.getErasure();
|
||||||
|
if (Types.isJavaObjectType(binding) || binding.isInterface()) {
|
||||||
|
return NameTable.ID_TYPE;
|
||||||
|
}
|
||||||
|
// otherwise fall-through
|
||||||
|
}
|
||||||
|
return NameTable.getFullName(binding);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String javaRefToObjC(Type type) {
|
||||||
|
return javaRefToObjC(Types.getTypeBinding(type));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String javaRefToObjC(ITypeBinding type) {
|
||||||
|
if (type.isPrimitive()) {
|
||||||
|
return primitiveTypeToObjC(type.getName());
|
||||||
|
}
|
||||||
|
String typeName = javaTypeToObjC(type, false);
|
||||||
|
if (typeName.equals(NameTable.ID_TYPE) || Types.isJavaVoidType(type)) {
|
||||||
|
if (type.isInterface()) {
|
||||||
|
return String.format("%s<%s>", NameTable.ID_TYPE, NameTable.getFullName(type));
|
||||||
|
}
|
||||||
|
return NameTable.ID_TYPE;
|
||||||
|
}
|
||||||
|
return typeName + " *";
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Return the full name of a type, including its package. For outer types,
|
||||||
|
* is the type's full name; for example, java.lang.Object's full name is
|
||||||
|
* "JavaLangObject". For inner classes, the full name is their outer class'
|
||||||
|
* name plus the inner class name; for example, java.util.ArrayList.ListItr's
|
||||||
|
* name is "JavaUtilArrayList_ListItr".
|
||||||
|
*/
|
||||||
|
public static String getFullName(AbstractTypeDeclaration typeDecl) {
|
||||||
|
return getFullName(Types.getTypeBinding(typeDecl));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getFullName(ITypeBinding binding) {
|
||||||
|
if (binding.isPrimitive()) {
|
||||||
|
return primitiveTypeToObjC(binding.getName());
|
||||||
|
}
|
||||||
|
binding = Types.mapType(binding.getErasure()); // Make sure type variables aren't included.
|
||||||
|
String suffix = binding.isEnum() ? "Enum" : "";
|
||||||
|
String prefix = "";
|
||||||
|
IMethodBinding outerMethod = binding.getDeclaringMethod();
|
||||||
|
if (outerMethod != null && !binding.isAnonymous()) {
|
||||||
|
prefix += "_" + outerMethod.getName();
|
||||||
|
}
|
||||||
|
ITypeBinding outerBinding = binding.getDeclaringClass();
|
||||||
|
if (outerBinding != null) {
|
||||||
|
while (outerBinding.isAnonymous()) {
|
||||||
|
prefix += "_" + outerBinding.getName();
|
||||||
|
outerBinding = outerBinding.getDeclaringClass();
|
||||||
|
}
|
||||||
|
String baseName = getFullName(outerBinding) + prefix + '_' + NameTable.getName(binding);
|
||||||
|
return outerBinding.isEnum() ? baseName : baseName + suffix;
|
||||||
|
}
|
||||||
|
IPackageBinding pkg = binding.getPackage();
|
||||||
|
String pkgName = pkg != null ? NameTable.getPrefix(pkg.getName()) : "";
|
||||||
|
return pkgName + binding.getName() + suffix;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue