current header and cpp file fix
This commit is contained in:
parent
df62e3c8d3
commit
9bedc21b7c
7 changed files with 2232 additions and 56 deletions
|
@ -86,7 +86,7 @@ public class MapUtils {
|
||||||
double R = 6371; // km
|
double R = 6371; // km
|
||||||
double dLat = Math.toRadians(lat2-lat1);
|
double dLat = Math.toRadians(lat2-lat1);
|
||||||
double dLon = Math.toRadians(lon2-lon1);
|
double dLon = Math.toRadians(lon2-lon1);
|
||||||
double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
|
double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
|
||||||
Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
|
Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
|
||||||
Math.sin(dLon/2) * Math.sin(dLon/2);
|
Math.sin(dLon/2) * Math.sin(dLon/2);
|
||||||
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
|
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
|
||||||
|
|
|
@ -18,16 +18,16 @@ package com.google.devtools.j2cpp;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import java.io.File;
|
||||||
import com.google.common.io.Files;
|
import java.io.IOException;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
import java.net.URLDecoder;
|
||||||
|
import java.nio.charset.Charset;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import com.google.devtools.j2objc.J2ObjC;
|
|
||||||
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.ObjectiveCImplementationGenerator;
|
|
||||||
import com.google.devtools.j2objc.gen.SourceBuilder;
|
|
||||||
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;
|
||||||
|
@ -39,15 +39,15 @@ import org.eclipse.jdt.core.dom.IVariableBinding;
|
||||||
import org.eclipse.jdt.core.dom.MethodDeclaration;
|
import org.eclipse.jdt.core.dom.MethodDeclaration;
|
||||||
import org.eclipse.jdt.core.dom.Statement;
|
import org.eclipse.jdt.core.dom.Statement;
|
||||||
|
|
||||||
import java.io.File;
|
import com.google.common.collect.Lists;
|
||||||
import java.io.IOException;
|
import com.google.common.io.Files;
|
||||||
import java.io.UnsupportedEncodingException;
|
import com.google.devtools.j2cpp.gen.CppStatementGenerator;
|
||||||
import java.net.URL;
|
import com.google.devtools.j2objc.J2ObjC;
|
||||||
import java.net.URLClassLoader;
|
import com.google.devtools.j2objc.J2ObjC.Language;
|
||||||
import java.net.URLDecoder;
|
import com.google.devtools.j2objc.Options;
|
||||||
import java.nio.charset.Charset;
|
import com.google.devtools.j2objc.gen.ObjectiveCHeaderGenerator;
|
||||||
import java.util.Collections;
|
import com.google.devtools.j2objc.gen.ObjectiveCImplementationGenerator;
|
||||||
import java.util.List;
|
import com.google.devtools.j2objc.gen.SourceBuilder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests code generation. A string containing the source code for a list of Java
|
* Tests code generation. A string containing the source code for a list of Java
|
||||||
|
@ -184,7 +184,7 @@ public abstract class GenerationTest extends TestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected String generateStatement(Statement statement) {
|
protected String generateStatement(Statement statement) {
|
||||||
return StatementGenerator.generate(statement,
|
return CppStatementGenerator.generate(statement,
|
||||||
Collections.<IVariableBinding>emptySet(), false, SourceBuilder.BEGINNING_OF_FILE).trim();
|
Collections.<IVariableBinding>emptySet(), false, SourceBuilder.BEGINNING_OF_FILE).trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -83,14 +83,12 @@ public class CppHeaderGenerator extends CppSourceFileGenerator{
|
||||||
String typeName = NameTableCpp.getFullName(node);
|
String typeName = NameTableCpp.getFullName(node);
|
||||||
String superName = NameTable.getSuperClassName(node);
|
String superName = NameTable.getSuperClassName(node);
|
||||||
|
|
||||||
//DONE if extends superclass other than Object
|
|
||||||
//TODO if implements interfaces
|
|
||||||
if ((superName != null) && (!superName.equals("NSObject"))) {
|
|
||||||
printf(": public %s", superName);
|
|
||||||
}
|
|
||||||
|
|
||||||
printConstantDefines(node);
|
printConstantDefines(node);
|
||||||
|
//TODO if implements interfaces
|
||||||
printf("class %s", typeName);
|
printf("class %s", typeName);
|
||||||
|
if ((superName != null) && (!superName.equals("NSObject"))) {
|
||||||
|
printf(" : %s", superName);
|
||||||
|
}
|
||||||
println(" {");
|
println(" {");
|
||||||
printInstanceVariables(node.getFields());
|
printInstanceVariables(node.getFields());
|
||||||
|
|
||||||
|
@ -271,7 +269,7 @@ public class CppHeaderGenerator extends CppSourceFileGenerator{
|
||||||
}
|
}
|
||||||
|
|
||||||
protected String createForwardDeclaration(String typeName, boolean isInterface) {
|
protected String createForwardDeclaration(String typeName, boolean isInterface) {
|
||||||
return String.format("@%s %s;", isInterface ? "TODO: change to abstract class \ninterface" : "class", typeName);
|
return String.format("%s %s;", isInterface ? "TODO: change to abstract class \ninterface" : "class", NameTableCpp.basicTypeToCpp(typeName));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected String createImport(ImportCollector.Import imp) {
|
protected String createImport(ImportCollector.Import imp) {
|
||||||
|
|
|
@ -44,8 +44,7 @@ import com.google.common.collect.Sets;
|
||||||
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.HiddenFieldDetector;
|
import com.google.devtools.j2objc.gen.HiddenFieldDetector;
|
||||||
import com.google.devtools.j2objc.gen.ObjectiveCSourceFileGenerator;
|
import com.google.devtools.j2cpp.gen.CppStatementGenerator;
|
||||||
import com.google.devtools.j2objc.gen.StatementGenerator;
|
|
||||||
import com.google.devtools.j2objc.types.IOSMethod;
|
import com.google.devtools.j2objc.types.IOSMethod;
|
||||||
import com.google.devtools.j2objc.types.ImplementationImportCollector;
|
import com.google.devtools.j2objc.types.ImplementationImportCollector;
|
||||||
import com.google.devtools.j2objc.types.ImportCollector;
|
import com.google.devtools.j2objc.types.ImportCollector;
|
||||||
|
@ -53,12 +52,13 @@ import com.google.devtools.j2objc.types.Types;
|
||||||
import com.google.devtools.j2objc.util.ErrorReportingASTVisitor;
|
import com.google.devtools.j2objc.util.ErrorReportingASTVisitor;
|
||||||
import com.google.devtools.j2objc.util.NameTable;
|
import com.google.devtools.j2objc.util.NameTable;
|
||||||
|
|
||||||
|
import com.google.devtools.j2cpp.gen.CppSourceFileGenerator;
|
||||||
/**
|
/**
|
||||||
* Generates C++ implementation (.m) files from compilation units.
|
* Generates C++ implementation (.m) files from compilation units.
|
||||||
*
|
*
|
||||||
* @author Tom Ball
|
* @author Tom Ball
|
||||||
*/
|
*/
|
||||||
public class CppImplementationGenerator extends ObjectiveCSourceFileGenerator {
|
public class CppImplementationGenerator extends CppSourceFileGenerator {
|
||||||
private Set<IVariableBinding> fieldHiders;
|
private Set<IVariableBinding> fieldHiders;
|
||||||
private final String suffix;
|
private final String suffix;
|
||||||
|
|
||||||
|
@ -307,8 +307,7 @@ public class CppImplementationGenerator extends ObjectiveCSourceFileGenerator {
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
List<Expression> args = constant.arguments(); // safe by definition
|
List<Expression> args = constant.arguments(); // safe by definition
|
||||||
String name = NameTable.getName(constant.getName());
|
String name = NameTable.getName(constant.getName());
|
||||||
String constantTypeName =
|
String constantTypeName = NameTable.getFullName(Types.getMethodBinding(constant).getDeclaringClass());
|
||||||
NameTable.getFullName(Types.getMethodBinding(constant).getDeclaringClass());
|
|
||||||
printf(" %s_%s = [[%s alloc] init", typeName, name, constantTypeName);
|
printf(" %s_%s = [[%s alloc] init", typeName, name, constantTypeName);
|
||||||
boolean isSimpleEnum = constantTypeName.equals(typeName);
|
boolean isSimpleEnum = constantTypeName.equals(typeName);
|
||||||
|
|
||||||
|
@ -316,7 +315,7 @@ public class CppImplementationGenerator extends ObjectiveCSourceFileGenerator {
|
||||||
if (args.isEmpty() && isSimpleEnum) {
|
if (args.isEmpty() && isSimpleEnum) {
|
||||||
printf("WithNSString:@\"%s_%s\" withInt:%d];\n", typeName.replace("Enum", ""), name, i);
|
printf("WithNSString:@\"%s_%s\" withInt:%d];\n", typeName.replace("Enum", ""), name, i);
|
||||||
} else {
|
} else {
|
||||||
String argString = StatementGenerator.generateArguments(Types.getMethodBinding(constant),
|
String argString = CppStatementGenerator.generateArguments(Types.getMethodBinding(constant),
|
||||||
args, fieldHiders, getBuilder().getCurrentLine());
|
args, fieldHiders, getBuilder().getCurrentLine());
|
||||||
print(argString);
|
print(argString);
|
||||||
if (args.isEmpty()) {
|
if (args.isEmpty()) {
|
||||||
|
@ -337,7 +336,7 @@ public class CppImplementationGenerator extends ObjectiveCSourceFileGenerator {
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
List<Statement> stmts = initializeMethod.getBody().statements(); // safe by definition
|
List<Statement> stmts = initializeMethod.getBody().statements(); // safe by definition
|
||||||
for (Statement s : stmts) {
|
for (Statement s : stmts) {
|
||||||
printf(" %s", StatementGenerator.generate(s, fieldHiders, false,
|
printf(" %s", CppStatementGenerator.generate(s, fieldHiders, false,
|
||||||
getBuilder().getCurrentLine()));
|
getBuilder().getCurrentLine()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -499,17 +498,17 @@ public class CppImplementationGenerator extends ObjectiveCSourceFileGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
private String generateStatement(Statement stmt, boolean asFunction, boolean inConstructor) {
|
private String generateStatement(Statement stmt, boolean asFunction, boolean inConstructor) {
|
||||||
return StatementGenerator.generate(stmt, fieldHiders, asFunction,
|
return CppStatementGenerator.generate(stmt, fieldHiders, asFunction,
|
||||||
getBuilder().getCurrentLine());
|
getBuilder().getCurrentLine());
|
||||||
}
|
}
|
||||||
|
|
||||||
private String generateStatement(Statement stmt, boolean asFunction) {
|
private String generateStatement(Statement stmt, boolean asFunction) {
|
||||||
return StatementGenerator.generate(stmt, fieldHiders, asFunction,
|
return CppStatementGenerator.generate(stmt, fieldHiders, asFunction,
|
||||||
getBuilder().getCurrentLine());
|
getBuilder().getCurrentLine());
|
||||||
}
|
}
|
||||||
|
|
||||||
private String generateExpression(Expression expr) {
|
private String generateExpression(Expression expr) {
|
||||||
return StatementGenerator.generate(expr, fieldHiders, false, getBuilder().getCurrentLine());
|
return CppStatementGenerator.generate(expr, fieldHiders, false, getBuilder().getCurrentLine());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void printMainMethod(MethodDeclaration m, String typeName,
|
private void printMainMethod(MethodDeclaration m, String typeName,
|
||||||
|
@ -591,7 +590,7 @@ public class CppImplementationGenerator extends ObjectiveCSourceFileGenerator {
|
||||||
if (!imports.isEmpty()) {
|
if (!imports.isEmpty()) {
|
||||||
Set<String> importStmts = Sets.newTreeSet();
|
Set<String> importStmts = Sets.newTreeSet();
|
||||||
for (ImportCollector.Import imp : imports) {
|
for (ImportCollector.Import imp : imports) {
|
||||||
importStmts.add(String.format("#include \"%s.h\"", imp.getImportFileName()));
|
importStmts.add(String.format("#include <%s.h>", imp.getImportFileName()));
|
||||||
}
|
}
|
||||||
for (String stmt : importStmts) {
|
for (String stmt : importStmts) {
|
||||||
println(stmt);
|
println(stmt);
|
||||||
|
|
|
@ -124,7 +124,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" : "",
|
||||||
NameTableCpp.javaRefToObjC(method.getReturnType2()), mappedMethod.getName());
|
NameTableCpp.javaRefToCpp(method.getReturnType2()), mappedMethod.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
sb.append(baseDeclaration);
|
sb.append(baseDeclaration);
|
||||||
|
@ -163,7 +163,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 " : "", NameTableCpp.javaRefToObjC(m.getReturnType2()), methodName);
|
String baseDeclaration = String.format(" %s %s %s", isStatic ? "static " : "", NameTableCpp.basicTypeToCpp(NameTableCpp.javaRefToCpp(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
|
||||||
|
@ -205,12 +205,12 @@ public abstract class CppSourceFileGenerator extends SourceFileGenerator {
|
||||||
String type = isTypeVariable ?
|
String type = isTypeVariable ?
|
||||||
NameTable.getParameterTypeName(NameTable.ID_TYPE, typeBinding) :
|
NameTable.getParameterTypeName(NameTable.ID_TYPE, typeBinding) :
|
||||||
NameTable.getParameterTypeName(NameTable.javaTypeToObjC(param.getType(), true), typeBinding);
|
NameTable.getParameterTypeName(NameTable.javaTypeToObjC(param.getType(), true), typeBinding);
|
||||||
sb.append(" ").append(type).append(" ").append(fieldName);
|
sb.append(" ").append(NameTableCpp.basicTypeToCpp(type)).append(typeBinding.isPrimitive() ? "" : "*").append(" ").append(fieldName);
|
||||||
if (i<nParams-1) {
|
if (i<nParams-1) {
|
||||||
sb.append(",");
|
sb.append(",");
|
||||||
} else {
|
} else {
|
||||||
sb.append(" )");
|
sb.append(" )");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// TODO
|
// TODO
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -38,12 +38,12 @@ public class NameTableCpp {
|
||||||
/**
|
/**
|
||||||
* Return the Objective-C equivalent name for a Java primitive type.
|
* Return the Objective-C equivalent name for a Java primitive type.
|
||||||
*/
|
*/
|
||||||
public static String primitiveTypeToObjC(PrimitiveType type) {
|
public static String primitiveTypeToCpp(PrimitiveType type) {
|
||||||
PrimitiveType.Code code = type.getPrimitiveTypeCode();
|
PrimitiveType.Code code = type.getPrimitiveTypeCode();
|
||||||
return primitiveTypeToObjC(code.toString());
|
return primitiveTypeToCpp(code.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String primitiveTypeToObjC(String javaName) {
|
private static String primitiveTypeToCpp(String javaName) {
|
||||||
if (javaName.equals("boolean")) {
|
if (javaName.equals("boolean")) {
|
||||||
return "bool"; // defined in NSObject.h
|
return "bool"; // defined in NSObject.h
|
||||||
}
|
}
|
||||||
|
@ -70,12 +70,32 @@ public class NameTableCpp {
|
||||||
return javaName;
|
return javaName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String basicTypeToCpp(String javaName) {
|
||||||
|
// TODO populate
|
||||||
|
if (javaName.equals("String")) {
|
||||||
|
return "string";
|
||||||
|
}
|
||||||
|
if (javaName.equals("NSString *")) {
|
||||||
|
return "string";
|
||||||
|
}
|
||||||
|
if (javaName.equals("JavaUtilList")) {
|
||||||
|
return "vector";
|
||||||
|
}
|
||||||
|
if (javaName.equals("LongInt")) {
|
||||||
|
return "long long";
|
||||||
|
}
|
||||||
|
if (javaName.equals("IOSCharArray *")) {
|
||||||
|
return "wchar_t []";
|
||||||
|
}
|
||||||
|
return javaName;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert a Java type into an equivalent Objective-C type.
|
* Convert a Java type into an equivalent C++ type.
|
||||||
*/
|
*/
|
||||||
public static String javaTypeToObjC(Type type, boolean includeInterfaces) {
|
public static String javaTypeToCpp(Type type, boolean includeInterfaces) {
|
||||||
if (type instanceof PrimitiveType) {
|
if (type instanceof PrimitiveType) {
|
||||||
return primitiveTypeToObjC((PrimitiveType) type);
|
return primitiveTypeToCpp((PrimitiveType) type);
|
||||||
}
|
}
|
||||||
if (type instanceof ParameterizedType) {
|
if (type instanceof ParameterizedType) {
|
||||||
type = ((ParameterizedType) type).getType(); // erase parameterized type
|
type = ((ParameterizedType) type).getType(); // erase parameterized type
|
||||||
|
@ -88,10 +108,10 @@ public class NameTableCpp {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ITypeBinding binding = Types.getTypeBinding(type);
|
ITypeBinding binding = Types.getTypeBinding(type);
|
||||||
return javaTypeToObjC(binding, includeInterfaces);
|
return javaTypeToCpp(binding, includeInterfaces);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String javaTypeToObjC(ITypeBinding binding, boolean includeInterfaces) {
|
public static String javaTypeToCpp(ITypeBinding binding, boolean includeInterfaces) {
|
||||||
if (binding.isInterface() && !includeInterfaces || binding == Types.resolveIOSType("id") ||
|
if (binding.isInterface() && !includeInterfaces || binding == Types.resolveIOSType("id") ||
|
||||||
binding == Types.resolveIOSType("NSObject")) {
|
binding == Types.resolveIOSType("NSObject")) {
|
||||||
return NameTable.ID_TYPE;
|
return NameTable.ID_TYPE;
|
||||||
|
@ -106,15 +126,15 @@ public class NameTableCpp {
|
||||||
return NameTable.getFullName(binding);
|
return NameTable.getFullName(binding);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String javaRefToObjC(Type type) {
|
public static String javaRefToCpp(Type type) {
|
||||||
return javaRefToObjC(Types.getTypeBinding(type));
|
return javaRefToCpp(Types.getTypeBinding(type));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String javaRefToObjC(ITypeBinding type) {
|
public static String javaRefToCpp(ITypeBinding type) {
|
||||||
if (type.isPrimitive()) {
|
if (type.isPrimitive()) {
|
||||||
return primitiveTypeToObjC(type.getName());
|
return primitiveTypeToCpp(type.getName());
|
||||||
}
|
}
|
||||||
String typeName = javaTypeToObjC(type, false);
|
String typeName = javaTypeToCpp(type, false);
|
||||||
if (typeName.equals(NameTable.ID_TYPE) || Types.isJavaVoidType(type)) {
|
if (typeName.equals(NameTable.ID_TYPE) || Types.isJavaVoidType(type)) {
|
||||||
if (type.isInterface()) {
|
if (type.isInterface()) {
|
||||||
return String.format("%s<%s>", NameTable.ID_TYPE, NameTable.getFullName(type));
|
return String.format("%s<%s>", NameTable.ID_TYPE, NameTable.getFullName(type));
|
||||||
|
@ -136,7 +156,7 @@ public class NameTableCpp {
|
||||||
|
|
||||||
public static String getFullName(ITypeBinding binding) {
|
public static String getFullName(ITypeBinding binding) {
|
||||||
if (binding.isPrimitive()) {
|
if (binding.isPrimitive()) {
|
||||||
return primitiveTypeToObjC(binding.getName());
|
return primitiveTypeToCpp(binding.getName());
|
||||||
}
|
}
|
||||||
binding = Types.mapType(binding.getErasure()); // Make sure type variables aren't included.
|
binding = Types.mapType(binding.getErasure()); // Make sure type variables aren't included.
|
||||||
String suffix = binding.isEnum() ? "Enum" : "";
|
String suffix = binding.isEnum() ? "Enum" : "";
|
||||||
|
|
Loading…
Reference in a new issue