1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/browser/android/java/java_type.h"
7 #include "base/logging.h"
8 #include "base/strings/string_util.h" // For ReplaceSubstringsAfterOffset
13 // Array component type names are similar to JNI type names, except for using
14 // dots as namespace separators in class names.
15 scoped_ptr<JavaType> CreateFromArrayComponentTypeName(
16 const std::string& type_name) {
17 scoped_ptr<JavaType> result(new JavaType());
18 DCHECK(!type_name.empty());
19 switch (type_name[0]) {
21 result->type = JavaType::TypeBoolean;
24 result->type = JavaType::TypeByte;
27 result->type = JavaType::TypeChar;
30 result->type = JavaType::TypeShort;
33 result->type = JavaType::TypeInt;
36 result->type = JavaType::TypeLong;
39 result->type = JavaType::TypeFloat;
42 result->type = JavaType::TypeDouble;
45 result->type = JavaType::TypeArray;
47 CreateFromArrayComponentTypeName(type_name.substr(1));
50 if (type_name == "Ljava.lang.String;") {
51 result->type = JavaType::TypeString;
52 result->class_jni_name = "java/lang/String";
54 result->type = JavaType::TypeObject;
55 result->class_jni_name = type_name.substr(1, type_name.length() - 2);
56 ReplaceSubstringsAfterOffset(&result->class_jni_name, 0, ".", "/");
68 JavaType::JavaType() {
71 JavaType::JavaType(const JavaType& other) {
75 JavaType::~JavaType() {
78 JavaType& JavaType::operator=(const JavaType& other) {
82 if (other.inner_type) {
83 DCHECK_EQ(JavaType::TypeArray, type);
84 inner_type.reset(new JavaType(*other.inner_type));
88 class_jni_name = other.class_jni_name;
93 JavaType JavaType::CreateFromBinaryName(const std::string& binary_name) {
95 DCHECK(!binary_name.empty());
96 if (binary_name == "boolean") {
97 result.type = JavaType::TypeBoolean;
98 } else if (binary_name == "byte") {
99 result.type = JavaType::TypeByte;
100 } else if (binary_name == "char") {
101 result.type = JavaType::TypeChar;
102 } else if (binary_name == "short") {
103 result.type = JavaType::TypeShort;
104 } else if (binary_name == "int") {
105 result.type = JavaType::TypeInt;
106 } else if (binary_name == "long") {
107 result.type = JavaType::TypeLong;
108 } else if (binary_name == "float") {
109 result.type = JavaType::TypeFloat;
110 } else if (binary_name == "double") {
111 result.type = JavaType::TypeDouble;
112 } else if (binary_name == "void") {
113 result.type = JavaType::TypeVoid;
114 } else if (binary_name[0] == '[') {
115 result.type = JavaType::TypeArray;
116 result.inner_type = CreateFromArrayComponentTypeName(binary_name.substr(1));
117 } else if (binary_name == "java.lang.String") {
118 result.type = JavaType::TypeString;
119 result.class_jni_name = "java/lang/String";
121 result.type = JavaType::TypeObject;
122 result.class_jni_name = binary_name;
123 ReplaceSubstringsAfterOffset(&result.class_jni_name, 0, ".", "/");
128 std::string JavaType::JNIName() const {
130 case JavaType::TypeBoolean:
132 case JavaType::TypeByte:
134 case JavaType::TypeChar:
136 case JavaType::TypeShort:
138 case JavaType::TypeInt:
140 case JavaType::TypeLong:
142 case JavaType::TypeFloat:
144 case JavaType::TypeDouble:
146 case JavaType::TypeVoid:
148 case JavaType::TypeArray:
149 return "[" + inner_type->JNISignature();
150 case JavaType::TypeString:
151 case JavaType::TypeObject:
152 return class_jni_name;
155 return std::string();
158 std::string JavaType::JNISignature() const {
159 if (type == JavaType::TypeString || type == JavaType::TypeObject)
160 return "L" + JNIName() + ";";
165 } // namespace content