Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
buildscript {
ext.kotlin_version = '1.3.50'

repositories {
google()
jcenter()
mavenLocal()
maven { url "https://dl.bintray.com/readdle/maven" }
}

dependencies {
classpath 'com.android.tools.build:gradle:3.3.0'
classpath 'com.readdle.android.swift:gradle:1.1.10'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4'
classpath "com.android.tools.build:gradle:3.5.0"
classpath "com.readdle.android.swift:gradle:1.3.0"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4"
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

import javax.lang.model.element.ExecutableElement;
Expand Down Expand Up @@ -129,9 +128,8 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
if (shouldCatchPreamble) {
swiftWriter.emitStatement("}");
swiftWriter.emitStatement("catch {");
swiftWriter.emitStatement("let errorString: String");
swiftWriter.emitStatement("if let nsError = error as? NSError { errorString = \"\\(nsError.domain): \\(nsError.code)\" }");
swiftWriter.emitStatement("else { errorString = String(reflecting: type(of: error)) + \": \" + String(describing: error) }");
swiftWriter.emitStatement("let nsError = error as NSError");
swiftWriter.emitStatement("let errorString = \"\\(nsError.domain): \\(nsError.code)\"");
swiftWriter.emitStatement("_ = JNI.api.ThrowNew(JNI.env, SwiftRuntimeErrorClass, errorString)");
swiftWriter.emitStatement(String.format("return%s", returnSwiftType != null ? " nil" : ""));
swiftWriter.emitStatement("}");
Expand Down Expand Up @@ -177,9 +175,8 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
}
swiftWriter.emitStatement("}");
swiftWriter.emitStatement("catch {");
swiftWriter.emitStatement("let errorString: String");
swiftWriter.emitStatement("if let nsError = error as? NSError { errorString = \"\\(nsError.domain): \\(nsError.code)\" }");
swiftWriter.emitStatement("else { errorString = String(reflecting: type(of: error)) + \": \" + String(describing: error) }");
swiftWriter.emitStatement("let nsError = error as NSError");
swiftWriter.emitStatement("let errorString = \"\\(nsError.domain): \\(nsError.code)\"");
swiftWriter.emitStatement("_ = JNI.api.ThrowNew(JNI.env, SwiftRuntimeErrorClass, errorString)");
swiftWriter.emitStatement("return nil");
swiftWriter.emitStatement("}");
Expand All @@ -188,9 +185,8 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
if (isThrown) {
swiftWriter.emitStatement("}");
swiftWriter.emitStatement("catch {");
swiftWriter.emitStatement("let errorString: String");
swiftWriter.emitStatement("if let nsError = error as? NSError { errorString = \"\\(nsError.domain): \\(nsError.code)\" }");
swiftWriter.emitStatement("else { errorString = String(reflecting: type(of: error)) + \": \" + String(describing: error) }");
swiftWriter.emitStatement("let nsError = error as NSError");
swiftWriter.emitStatement("let errorString = \"\\(nsError.domain): \\(nsError.code)\"");
swiftWriter.emitStatement("_ = JNI.api.ThrowNew(JNI.env, SwiftErrorClass, errorString)");
swiftWriter.emitStatement(String.format("return%s", returnSwiftType != null ? " nil" : ""));
swiftWriter.emitStatement("}");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,8 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
swiftWriter.emitStatement(String.format("swiftSelf = try %s.from(javaObject: this)", swiftType));
swiftWriter.emitStatement("}");
swiftWriter.emitStatement("catch {");
swiftWriter.emitStatement("let errorString: String");
swiftWriter.emitStatement("if let nsError = error as? NSError { errorString = \"\\(nsError.domain): \\(nsError.code)\" }");
swiftWriter.emitStatement("else { errorString = String(reflecting: type(of: error)) + \": \" + String(describing: error) }");
swiftWriter.emitStatement("let nsError = error as NSError");
swiftWriter.emitStatement("let errorString = \"\\(nsError.domain): \\(nsError.code)\"");
swiftWriter.emitStatement("_ = JNI.api.ThrowNew(JNI.env, SwiftRuntimeErrorClass, errorString)");
swiftWriter.emitStatement(String.format("return%s", returnSwiftType != null ? " nil" : ""));
swiftWriter.emitStatement("}");
Expand All @@ -81,9 +80,8 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
}
swiftWriter.emitStatement("}");
swiftWriter.emitStatement("catch {");
swiftWriter.emitStatement("let errorString: String");
swiftWriter.emitStatement("if let nsError = error as? NSError { errorString = \"\\(nsError.domain): \\(nsError.code)\" }");
swiftWriter.emitStatement("else { errorString = String(reflecting: type(of: error)) + \": \" + String(describing: error) }");
swiftWriter.emitStatement("let nsError = error as NSError");
swiftWriter.emitStatement("let errorString = \"\\(nsError.domain): \\(nsError.code)\"");
swiftWriter.emitStatement("_ = JNI.api.ThrowNew(JNI.env, SwiftRuntimeErrorClass, errorString)");
swiftWriter.emitStatement("return nil");
swiftWriter.emitStatement("}");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,22 @@
import com.readdle.codegen.anotation.SwiftReference;
import com.readdle.codegen.anotation.SwiftSetter;

import javax.annotation.processing.Filer;
import javax.lang.model.element.*;
import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.MirroredTypeException;
import javax.tools.StandardLocation;
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

import javax.annotation.processing.Filer;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.MirroredTypeException;
import javax.tools.StandardLocation;

import static com.readdle.codegen.JavaSwiftProcessor.FOLDER;

class SwiftReferenceDescriptor {
Expand Down Expand Up @@ -143,15 +149,15 @@ File generateCode() throws IOException {

swiftWriter.emitEmptyLine();
swiftWriter.emitStatement("// Get swift object from pointer");
swiftWriter.emitStatement(String.format("public static func from(javaObject: jobject) throws -> %s {", simpleTypeName));
swiftWriter.emitStatement(String.format("static func from(javaObject: jobject) throws -> %s {", simpleTypeName));
swiftWriter.emitStatement("let longPointer = JNI.api.GetLongField(JNI.env, javaObject, javaSwiftPointerFiled)");
swiftWriter.emitStatement("guard longPointer != 0, let pointer = UnsafeRawPointer(bitPattern: Int(longPointer)) else {\nthrow NSError(domain: \"java.lang.NullPointerException\", code: 1)\n}");
swiftWriter.emitStatement(String.format("return Unmanaged<%s>.fromOpaque(pointer).takeUnretainedValue()", simpleTypeName));
swiftWriter.emitStatement("}");

swiftWriter.emitEmptyLine();
swiftWriter.emitStatement("// Create java object with native pointer");
swiftWriter.emitStatement("public func javaObject() throws -> jobject {");
swiftWriter.emitStatement("func javaObject() throws -> jobject {");
swiftWriter.emitStatement("let nativePointer = jlong(Int(bitPattern: Unmanaged.passRetained(self).toOpaque()))");
swiftWriter.emitStatement("guard let result = JNI.NewObject(javaClass, methodID: javaConstructor) else {\nthrow NSError(domain: \"CantCreateObject\", code: 1)\n}");
swiftWriter.emitStatement("JNI.api.SetLongField(JNI.env, result, javaSwiftPointerFiled, nativePointer)");
Expand All @@ -160,13 +166,13 @@ File generateCode() throws IOException {

swiftWriter.emitEmptyLine();
swiftWriter.emitStatement("// Unbalance release");
swiftWriter.emitStatement("public func release() {");
swiftWriter.emitStatement("func release() {");
swiftWriter.emitStatement("Unmanaged.passUnretained(self).release()");
swiftWriter.emitStatement("}");

swiftWriter.emitEmptyLine();
swiftWriter.emitStatement("// Unbalanced retain");
swiftWriter.emitStatement("public func retain() {");
swiftWriter.emitStatement("func retain() {");
swiftWriter.emitStatement("_ = Unmanaged.passUnretained(self).retain()");
swiftWriter.emitStatement("}");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;

import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.Modifier;
Expand Down Expand Up @@ -81,9 +80,8 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw

swiftWriter.emitStatement("}");
swiftWriter.emitStatement("catch {");
swiftWriter.emitStatement("let errorString: String");
swiftWriter.emitStatement("if let nsError = error as? NSError { errorString = \"\\(nsError.domain): \\(nsError.code)\" }");
swiftWriter.emitStatement("else { errorString = String(reflecting: type(of: error)) + \": \" + String(describing: error) }");
swiftWriter.emitStatement("let nsError = error as NSError");
swiftWriter.emitStatement("let errorString = \"\\(nsError.domain): \\(nsError.code)\"");
swiftWriter.emitStatement("_ = JNI.api.ThrowNew(JNI.env, SwiftRuntimeErrorClass, errorString)");
swiftWriter.emitStatement("return");
swiftWriter.emitStatement("}");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,22 +127,22 @@ File generateCode() throws IOException {
if (hasSubclasses) {
swiftWriter.emitEmptyLine();
swiftWriter.emitStatement("// Decoding SwiftValue type with JavaCoder");
swiftWriter.emitStatement(String.format("public static func from<T: %s>(javaObject: jobject) throws -> T {", simpleTypeName));
swiftWriter.emitStatement(String.format("static func from<T: %s>(javaObject: jobject) throws -> T {", simpleTypeName));
swiftWriter.emitStatement(String.format("let any = try JavaDecoder(forPackage: \"%s\", missingFieldsStrategy: .ignore).decode(AnyCodable.self, from: javaObject)", javaPackage.replace(".", "/")));
swiftWriter.emitStatement("return any.value as! T");
swiftWriter.emitStatement("}");
}
else {
swiftWriter.emitEmptyLine();
swiftWriter.emitStatement("// Decoding SwiftValue type with JavaCoder");
swiftWriter.emitStatement(String.format("public static func from(javaObject: jobject) throws -> %s {", simpleTypeName));
swiftWriter.emitStatement(String.format("static func from(javaObject: jobject) throws -> %s {", simpleTypeName));
swiftWriter.emitStatement(String.format("return try JavaDecoder(forPackage: \"%s\", missingFieldsStrategy: .ignore).decode(%s.self, from: javaObject)", javaPackage.replace(".", "/"), simpleTypeName));
swiftWriter.emitStatement("}");
}

swiftWriter.emitEmptyLine();
swiftWriter.emitStatement("// Encoding SwiftValue type with JavaCoder");
swiftWriter.emitStatement("public func javaObject() throws -> jobject {");
swiftWriter.emitStatement("func javaObject() throws -> jobject {");
swiftWriter.emitStatement(String.format("return try JavaEncoder(forPackage: \"%s\", missingFieldsStrategy: .ignore).encode(self)", javaPackage.replace(".", "/")));
swiftWriter.emitStatement("}");

Expand Down
4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#Sun Apr 29 18:40:15 EEST 2018
#Thu Aug 29 12:50:13 EEST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
10 changes: 7 additions & 3 deletions sample/build.gradle
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
apply plugin: 'com.android.application'
apply plugin: 'com.readdle.android.swift'

apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

swift {
cleanEnabled true
debug {
abiFilters("arm64-v8a", "x86_64")
extraBuildFlags("-Xswiftc", "-DDEBUG")
}
}
Expand All @@ -30,10 +34,10 @@ dependencies {
annotationProcessor project(':compiler')
implementation project(':library')

implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.0'
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support:support-annotations:27.1.1'
androidTestImplementation 'com.android.support:support-annotations:28.0.0'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test:rules:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
Expand Down
25 changes: 10 additions & 15 deletions sample/src/main/swift/Package.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// swift-tools-version:4.0
// swift-tools-version:5.0
import Foundation
import PackageDescription

Expand All @@ -9,15 +9,11 @@ let generatedName = "Generated"
let generatedPath = ".build/\(generatedName.lowercased())"

let isSourcesGenerated: Bool = {
let basePath = URL(fileURLWithPath: #file)
.deletingLastPathComponent()
.path

let fileManager = FileManager()
fileManager.changeCurrentDirectoryPath(basePath)
let baseURL = URL(fileURLWithPath: #file).deletingLastPathComponent()
let generatedURL = baseURL.appendingPathComponent(generatedPath)

var isDirectory: ObjCBool = false
let exists = fileManager.fileExists(atPath: generatedPath, isDirectory: &isDirectory)
let exists = FileManager.default.fileExists(atPath: generatedURL.path, isDirectory: &isDirectory)

return exists && isDirectory.boolValue
}()
Expand All @@ -41,7 +37,7 @@ func addGenerated(_ targets: [Target]) -> [Target] {
.target(
name: generatedName,
dependencies: [
.byNameItem(name: packageName),
.byName(name: packageName),
"java_swift",
"Java",
"JavaCoder",
Expand All @@ -57,13 +53,12 @@ let package = Package(
products: addGenerated([
]),
dependencies: [
.package(url: "https://github.com/readdle/java_swift.git", .exact("2.1.3")),
.package(url: "https://github.com/readdle/swift-java.git", .exact("0.1.5")),
.package(url: "https://github.com/readdle/swift-java-coder.git", .exact("1.0.5")),
.package(url: "https://github.com/readdle/swift-anycodable.git", .exact("1.0.0")),
.package(url: "https://github.com/readdle/java_swift.git", .exact("2.1.7")),
.package(url: "https://github.com/readdle/swift-java.git", .exact("0.2.0")),
.package(url: "https://github.com/readdle/swift-java-coder.git", .exact("1.0.13")),
.package(url: "https://github.com/readdle/swift-anycodable.git", .exact("1.0.2")),
],
targets: addGenerated([
.target(name: packageName, dependencies: ["AnyCodable"])
]),
swiftLanguageVersions: [4]
])
)