mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Codegen: JavaGenerator [6] - resolve individual types into their generated code
Summary: For each resolved type, define how to process its own type and whether it should produce generated code/file, minus the NativeModuleResolvedType (will be in the next commit). Changelog: [Internal] Reviewed By: mdvacca Differential Revision: D23307961 fbshipit-source-id: 87af09867aace7a5ff060a33a00b141048630eda
This commit is contained in:
committed by
Facebook GitHub Bot
parent
eda1f8da7b
commit
8fc1646c75
+13
-22
@@ -8,14 +8,13 @@
|
||||
package com.facebook.react.codegen.generator;
|
||||
|
||||
import com.facebook.react.codegen.generator.model.TypeData;
|
||||
import com.facebook.react.codegen.generator.resolver.ResolvedType;
|
||||
import com.facebook.react.codegen.generator.resolver.TypeResolver;
|
||||
import com.squareup.javapoet.JavaFile;
|
||||
import com.squareup.javapoet.MethodSpec;
|
||||
import com.squareup.javapoet.TypeSpec;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import javax.lang.model.element.Modifier;
|
||||
|
||||
// TODO: Implement proper generator - this is a sample usage of JavaPoet
|
||||
public final class JavaGenerator {
|
||||
@@ -35,26 +34,18 @@ public final class JavaGenerator {
|
||||
.getAllTypes()
|
||||
.forEach(
|
||||
t -> {
|
||||
// TODO: Ask each resolved type to produce its own code if it supports it.
|
||||
TypeResolver.resolveType(typeData.getType(t), typeData, false);
|
||||
ResolvedType resolvedType =
|
||||
TypeResolver.resolveType(typeData.getType(t), typeData, false);
|
||||
TypeSpec spec = resolvedType.getGeneratedCode(mJavaPackageName);
|
||||
if (spec != null) {
|
||||
final JavaFile javaFile = JavaFile.builder(mJavaPackageName, spec).build();
|
||||
System.out.println(javaFile.toString());
|
||||
try {
|
||||
javaFile.writeTo(mOutputDir);
|
||||
} catch (IOException ex) {
|
||||
// TODO: Handle this in a different way.
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
final MethodSpec main =
|
||||
MethodSpec.methodBuilder("main")
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||
.returns(void.class)
|
||||
.addParameter(String[].class, "args")
|
||||
.addStatement("$T.out.println($S)", System.class, "Hello, JavaPoet!")
|
||||
.build();
|
||||
|
||||
final TypeSpec helloWorld =
|
||||
TypeSpec.classBuilder("ReactNativeCodegen")
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
|
||||
.addMethod(main)
|
||||
.build();
|
||||
|
||||
final JavaFile javaFile = JavaFile.builder(mJavaPackageName, helloWorld).build();
|
||||
|
||||
javaFile.writeTo(mOutputDir);
|
||||
}
|
||||
}
|
||||
|
||||
+9
-6
@@ -11,6 +11,7 @@ import com.facebook.react.codegen.generator.model.AliasType;
|
||||
import com.facebook.react.codegen.generator.model.AnyType;
|
||||
import com.facebook.react.codegen.generator.model.ArrayType;
|
||||
import com.facebook.react.codegen.generator.model.BooleanType;
|
||||
import com.facebook.react.codegen.generator.model.CodegenException;
|
||||
import com.facebook.react.codegen.generator.model.DoubleType;
|
||||
import com.facebook.react.codegen.generator.model.FloatType;
|
||||
import com.facebook.react.codegen.generator.model.FunctionType;
|
||||
@@ -44,12 +45,14 @@ import java.util.stream.Collectors;
|
||||
public final class SchemaJsonParser {
|
||||
private final TypeData mTypeData = new TypeData();
|
||||
|
||||
public static TypeData parse(final File schemaFile) throws FileNotFoundException, IOException {
|
||||
public static TypeData parse(final File schemaFile)
|
||||
throws CodegenException, FileNotFoundException, IOException {
|
||||
final SchemaJsonParser parser = new SchemaJsonParser();
|
||||
return parser.buildTypeData(schemaFile);
|
||||
}
|
||||
|
||||
private TypeData buildTypeData(final File schemaFile) throws FileNotFoundException, IOException {
|
||||
private TypeData buildTypeData(final File schemaFile)
|
||||
throws CodegenException, FileNotFoundException, IOException {
|
||||
final JsonParser parser = new JsonParser();
|
||||
final JsonElement rootElement = parser.parse(new FileReader(schemaFile));
|
||||
|
||||
@@ -90,8 +93,7 @@ public final class SchemaJsonParser {
|
||||
}
|
||||
|
||||
// Parse type information from a JSON "typeAnnotation" node.
|
||||
private Type parseTypeAnnotation(final TypeId typeId, final JsonObject typeAnnotation)
|
||||
throws IllegalStateException {
|
||||
private Type parseTypeAnnotation(final TypeId typeId, final JsonObject typeAnnotation) {
|
||||
final String type = typeAnnotation.get("type").getAsString();
|
||||
// TODO (T71824250): Support NullableTypeAnnotation in the schema instead of a field here.
|
||||
final boolean nullable =
|
||||
@@ -128,7 +130,8 @@ public final class SchemaJsonParser {
|
||||
parsedType = new Int32Type(typeId);
|
||||
break;
|
||||
case NumberType.TYPE_NAME:
|
||||
parsedType = new NumberType(typeId);
|
||||
// Use double type for generic numbers.
|
||||
parsedType = new DoubleType(typeId);
|
||||
break;
|
||||
case ObjectType.TYPE_NAME:
|
||||
parsedType = parseObjectTypeAnnotation(typeId, typeAnnotation);
|
||||
@@ -145,7 +148,7 @@ public final class SchemaJsonParser {
|
||||
case VoidType.TYPE_NAME:
|
||||
return VoidType.VOID;
|
||||
default:
|
||||
throw new IllegalStateException("Found invalid type annotation: " + type);
|
||||
throw new CodegenException("Found invalid type annotation: " + type);
|
||||
}
|
||||
|
||||
final Type finalType = maybeCreateNullableType(nullable, parsedType);
|
||||
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
package com.facebook.react.codegen.generator.model;
|
||||
|
||||
public class CodegenException extends RuntimeException {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public CodegenException(final String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -10,10 +10,10 @@ package com.facebook.react.codegen.generator.model;
|
||||
public final class NullableType extends Type {
|
||||
public static final String TYPE_NAME = "NullableTypeAnnotation";
|
||||
|
||||
public final Type referredType;
|
||||
public final Type innerType;
|
||||
|
||||
public NullableType(final TypeId typeId, final Type referredType) {
|
||||
public NullableType(final TypeId typeId, final Type innerType) {
|
||||
super(typeId);
|
||||
this.referredType = referredType;
|
||||
this.innerType = innerType;
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
|
||||
package com.facebook.react.codegen.generator.model;
|
||||
|
||||
public class NumberType extends Type {
|
||||
public abstract class NumberType extends Type {
|
||||
public static final String TYPE_NAME = "NumberTypeAnnotation";
|
||||
|
||||
public NumberType(final TypeId typeId) {
|
||||
|
||||
+5
@@ -20,4 +20,9 @@ public final class ReservedFunctionValueType extends Type {
|
||||
super(typeId);
|
||||
this.reservedName = reservedName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return mTypeId + "(" + reservedName.toString() + ")";
|
||||
}
|
||||
}
|
||||
|
||||
+10
-5
@@ -8,6 +8,8 @@
|
||||
package com.facebook.react.codegen.generator.resolver;
|
||||
|
||||
import com.facebook.react.codegen.generator.model.AliasType;
|
||||
import com.facebook.react.codegen.generator.model.AnyType;
|
||||
import com.facebook.react.codegen.generator.model.Type;
|
||||
import com.facebook.react.codegen.generator.model.TypeData;
|
||||
import com.squareup.javapoet.TypeName;
|
||||
import com.squareup.javapoet.TypeSpec;
|
||||
@@ -17,22 +19,25 @@ public final class AliasResolvedType extends ResolvedType<AliasType> {
|
||||
|
||||
private AliasResolvedType(final AliasType type, final boolean nullable) {
|
||||
super(type, nullable);
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public static AliasResolvedType create(
|
||||
public static ResolvedType create(
|
||||
final AliasType type, final TypeData typeData, final boolean nullable) {
|
||||
return new AliasResolvedType(type, nullable);
|
||||
Type referredType = typeData.getType(type.referredTypeId);
|
||||
if (referredType != null) {
|
||||
return resolveType(referredType, typeData, nullable);
|
||||
}
|
||||
return resolveType(new AnyType(type.getTypeId()), typeData, nullable);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TypeName getNativeType(final NativeTypeContext typeContext) {
|
||||
// TODO
|
||||
return TypeName.VOID;
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable TypeSpec getGeneratedCode(final String packageName) {
|
||||
// TODO
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
||||
|
||||
+8
-10
@@ -10,8 +10,6 @@ package com.facebook.react.codegen.generator.resolver;
|
||||
import com.facebook.react.codegen.generator.model.AnyType;
|
||||
import com.facebook.react.codegen.generator.model.TypeData;
|
||||
import com.squareup.javapoet.TypeName;
|
||||
import com.squareup.javapoet.TypeSpec;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public final class AnyResolvedType extends ResolvedType<AnyType> {
|
||||
|
||||
@@ -26,13 +24,13 @@ public final class AnyResolvedType extends ResolvedType<AnyType> {
|
||||
|
||||
@Override
|
||||
public TypeName getNativeType(final NativeTypeContext typeContext) {
|
||||
// TODO
|
||||
return TypeName.VOID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable TypeSpec getGeneratedCode(final String packageName) {
|
||||
// TODO
|
||||
throw new UnsupportedOperationException();
|
||||
switch (typeContext) {
|
||||
case FUNCTION_ARGUMENT:
|
||||
return TypeUtils.makeNullable(ReactClassNames.REACT_READABLE_MAP, mNullable);
|
||||
case FUNCTION_RETURN:
|
||||
return TypeUtils.makeNullable(ReactClassNames.REACT_WRITABLE_MAP, mNullable);
|
||||
default:
|
||||
return TypeUtils.makeNullable(TypeName.OBJECT, mNullable);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+19
-12
@@ -9,30 +9,37 @@ package com.facebook.react.codegen.generator.resolver;
|
||||
|
||||
import com.facebook.react.codegen.generator.model.ArrayType;
|
||||
import com.facebook.react.codegen.generator.model.TypeData;
|
||||
import com.squareup.javapoet.ArrayTypeName;
|
||||
import com.squareup.javapoet.TypeName;
|
||||
import com.squareup.javapoet.TypeSpec;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public final class ArrayResolvedType extends ResolvedType<ArrayType> {
|
||||
|
||||
private ArrayResolvedType(final ArrayType type, final boolean nullable) {
|
||||
private final ResolvedType mElementResolvedType;
|
||||
|
||||
private ArrayResolvedType(final ArrayType type, final TypeData typeData, final boolean nullable) {
|
||||
super(type, nullable);
|
||||
mElementResolvedType = resolveType(mType.elementType, typeData, nullable);
|
||||
}
|
||||
|
||||
public static ArrayResolvedType create(
|
||||
final ArrayType type, final TypeData typeData, final boolean nullable) {
|
||||
return new ArrayResolvedType(type, nullable);
|
||||
return new ArrayResolvedType(type, typeData, nullable);
|
||||
}
|
||||
|
||||
public ResolvedType getElementResolvedType() {
|
||||
return mElementResolvedType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TypeName getNativeType(final NativeTypeContext typeContext) {
|
||||
// TODO
|
||||
return TypeName.VOID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable TypeSpec getGeneratedCode(final String packageName) {
|
||||
// TODO
|
||||
throw new UnsupportedOperationException();
|
||||
switch (typeContext) {
|
||||
case FUNCTION_ARGUMENT:
|
||||
return TypeUtils.makeNullable(ReactClassNames.REACT_READABLE_ARRAY, mNullable);
|
||||
case FUNCTION_RETURN:
|
||||
return TypeUtils.makeNullable(ReactClassNames.REACT_WRITABLE_ARRAY, mNullable);
|
||||
default:
|
||||
return TypeUtils.makeNullable(
|
||||
ArrayTypeName.of(mElementResolvedType.getNativeType(typeContext)), mNullable);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-10
@@ -10,8 +10,6 @@ package com.facebook.react.codegen.generator.resolver;
|
||||
import com.facebook.react.codegen.generator.model.BooleanType;
|
||||
import com.facebook.react.codegen.generator.model.TypeData;
|
||||
import com.squareup.javapoet.TypeName;
|
||||
import com.squareup.javapoet.TypeSpec;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public final class BooleanResolvedType extends ResolvedType<BooleanType> {
|
||||
|
||||
@@ -26,13 +24,6 @@ public final class BooleanResolvedType extends ResolvedType<BooleanType> {
|
||||
|
||||
@Override
|
||||
public TypeName getNativeType(final NativeTypeContext typeContext) {
|
||||
// TODO
|
||||
return TypeName.VOID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable TypeSpec getGeneratedCode(final String packageName) {
|
||||
// TODO
|
||||
throw new UnsupportedOperationException();
|
||||
return TypeUtils.makeNullable(TypeName.BOOLEAN, mNullable);
|
||||
}
|
||||
}
|
||||
|
||||
+24
-12
@@ -10,29 +10,41 @@ package com.facebook.react.codegen.generator.resolver;
|
||||
import com.facebook.react.codegen.generator.model.FunctionType;
|
||||
import com.facebook.react.codegen.generator.model.TypeData;
|
||||
import com.squareup.javapoet.TypeName;
|
||||
import com.squareup.javapoet.TypeSpec;
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public final class FunctionResolvedType extends ResolvedType<FunctionType> {
|
||||
private final Map<String, ResolvedType> mResolvedArgTypes;
|
||||
private final ResolvedType mResolvedReturnType;
|
||||
|
||||
private FunctionResolvedType(final FunctionType type, final boolean nullable) {
|
||||
private FunctionResolvedType(
|
||||
final FunctionType type, final TypeData typeData, final boolean nullable) {
|
||||
super(type, nullable);
|
||||
mResolvedReturnType = resolveType(type.returnType, typeData, nullable);
|
||||
mResolvedArgTypes =
|
||||
Collections.unmodifiableMap(
|
||||
type.parameters.stream()
|
||||
.collect(
|
||||
Collectors.toMap(
|
||||
item -> item.name, item -> resolveType(item.type, typeData, false))));
|
||||
}
|
||||
|
||||
public static FunctionResolvedType create(
|
||||
final FunctionType type, final TypeData typeData, final boolean nullable) {
|
||||
return new FunctionResolvedType(type, nullable);
|
||||
return new FunctionResolvedType(type, typeData, nullable);
|
||||
}
|
||||
|
||||
public ResolvedType getResolvedReturnType() {
|
||||
return mResolvedReturnType;
|
||||
}
|
||||
|
||||
public Map<String, ResolvedType> getResolvedArgTypes() {
|
||||
return mResolvedArgTypes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TypeName getNativeType(final NativeTypeContext typeContext) {
|
||||
// TODO
|
||||
return TypeName.VOID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable TypeSpec getGeneratedCode(final String packageName) {
|
||||
// TODO
|
||||
throw new UnsupportedOperationException();
|
||||
return TypeUtils.makeNullable(ReactClassNames.REACT_CALLBACK, mNullable);
|
||||
}
|
||||
}
|
||||
|
||||
+11
-9
@@ -7,11 +7,10 @@
|
||||
|
||||
package com.facebook.react.codegen.generator.resolver;
|
||||
|
||||
import com.facebook.react.codegen.generator.model.CodegenException;
|
||||
import com.facebook.react.codegen.generator.model.GenericObjectType;
|
||||
import com.facebook.react.codegen.generator.model.TypeData;
|
||||
import com.squareup.javapoet.TypeName;
|
||||
import com.squareup.javapoet.TypeSpec;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public final class GenericObjectResolvedType extends ResolvedType<GenericObjectType> {
|
||||
|
||||
@@ -26,13 +25,16 @@ public final class GenericObjectResolvedType extends ResolvedType<GenericObjectT
|
||||
|
||||
@Override
|
||||
public TypeName getNativeType(final NativeTypeContext typeContext) {
|
||||
// TODO
|
||||
return TypeName.VOID;
|
||||
}
|
||||
switch (typeContext) {
|
||||
case FUNCTION_ARGUMENT:
|
||||
return TypeUtils.makeNullable(ReactClassNames.REACT_READABLE_MAP, mNullable);
|
||||
case FUNCTION_RETURN:
|
||||
return TypeUtils.makeNullable(ReactClassNames.REACT_WRITABLE_MAP, mNullable);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable TypeSpec getGeneratedCode(final String packageName) {
|
||||
// TODO
|
||||
throw new UnsupportedOperationException();
|
||||
throw new CodegenException(
|
||||
"Unsupported GenericObjectType: " + mType + " - typeContext: " + typeContext);
|
||||
}
|
||||
}
|
||||
|
||||
+40
-6
@@ -9,30 +9,64 @@ package com.facebook.react.codegen.generator.resolver;
|
||||
|
||||
import com.facebook.react.codegen.generator.model.NativeModuleType;
|
||||
import com.facebook.react.codegen.generator.model.TypeData;
|
||||
import com.squareup.javapoet.MethodSpec;
|
||||
import com.squareup.javapoet.TypeName;
|
||||
import com.squareup.javapoet.TypeSpec;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
import javax.annotation.Nullable;
|
||||
import javax.lang.model.element.Modifier;
|
||||
|
||||
public final class NativeModuleResolvedType extends ResolvedType<NativeModuleType> {
|
||||
private final Map<String, ResolvedType> mResolvedAliasTypes;
|
||||
private final Map<String, ResolvedType> mResolvedPropertyTypes;
|
||||
|
||||
private NativeModuleResolvedType(final NativeModuleType type, final boolean nullable) {
|
||||
private NativeModuleResolvedType(
|
||||
final NativeModuleType type, final TypeData typeData, final boolean nullable) {
|
||||
super(type, nullable);
|
||||
mResolvedAliasTypes =
|
||||
Collections.unmodifiableMap(
|
||||
type.aliases.stream()
|
||||
.collect(
|
||||
Collectors.toMap(
|
||||
item -> item.getTypeId().typeName,
|
||||
item -> resolveType(item, typeData, false))));
|
||||
mResolvedPropertyTypes =
|
||||
Collections.unmodifiableMap(
|
||||
type.properties.stream()
|
||||
.collect(
|
||||
Collectors.toMap(
|
||||
item -> item.name,
|
||||
// TODO: Optional Object property is not necessarily nullable.
|
||||
item -> resolveType(item.type, typeData, item.optional))));
|
||||
}
|
||||
|
||||
public static NativeModuleResolvedType create(
|
||||
final NativeModuleType type, final TypeData typeData, final boolean nullable) {
|
||||
return new NativeModuleResolvedType(type, nullable);
|
||||
return new NativeModuleResolvedType(type, typeData, nullable);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TypeName getNativeType(final NativeTypeContext typeContext) {
|
||||
// TODO
|
||||
return TypeName.VOID;
|
||||
throw new UnsupportedOperationException(
|
||||
"NativeModuleType cannot be referred to by other types.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable TypeSpec getGeneratedCode(final String packageName) {
|
||||
// TODO
|
||||
throw new UnsupportedOperationException();
|
||||
// TODO: Remove this placeholder implementation.
|
||||
final MethodSpec main =
|
||||
MethodSpec.methodBuilder("main")
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||
.returns(void.class)
|
||||
.addParameter(String[].class, "args")
|
||||
.addStatement("$T.out.println($S)", System.class, "Hello, JavaPoet!")
|
||||
.build();
|
||||
|
||||
return TypeSpec.classBuilder(mType.getTypeId().typeName)
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
|
||||
.addMethod(main)
|
||||
.build();
|
||||
}
|
||||
}
|
||||
|
||||
+4
-5
@@ -17,22 +17,21 @@ public final class NullableResolvedType extends ResolvedType<NullableType> {
|
||||
|
||||
private NullableResolvedType(final NullableType type, final boolean nullable) {
|
||||
super(type, nullable);
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public static NullableResolvedType create(
|
||||
public static ResolvedType create(
|
||||
final NullableType type, final TypeData typeData, final boolean nullable) {
|
||||
return new NullableResolvedType(type, nullable);
|
||||
return resolveType(type.innerType, typeData, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TypeName getNativeType(final NativeTypeContext typeContext) {
|
||||
// TODO
|
||||
return TypeName.VOID;
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable TypeSpec getGeneratedCode(final String packageName) {
|
||||
// TODO
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
||||
|
||||
+14
-10
@@ -7,11 +7,13 @@
|
||||
|
||||
package com.facebook.react.codegen.generator.resolver;
|
||||
|
||||
import com.facebook.react.codegen.generator.model.CodegenException;
|
||||
import com.facebook.react.codegen.generator.model.DoubleType;
|
||||
import com.facebook.react.codegen.generator.model.FloatType;
|
||||
import com.facebook.react.codegen.generator.model.Int32Type;
|
||||
import com.facebook.react.codegen.generator.model.NumberType;
|
||||
import com.facebook.react.codegen.generator.model.TypeData;
|
||||
import com.squareup.javapoet.TypeName;
|
||||
import com.squareup.javapoet.TypeSpec;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public final class NumberResolvedType extends ResolvedType<NumberType> {
|
||||
|
||||
@@ -26,13 +28,15 @@ public final class NumberResolvedType extends ResolvedType<NumberType> {
|
||||
|
||||
@Override
|
||||
public TypeName getNativeType(final NativeTypeContext typeContext) {
|
||||
// TODO
|
||||
return TypeName.VOID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable TypeSpec getGeneratedCode(final String packageName) {
|
||||
// TODO
|
||||
throw new UnsupportedOperationException();
|
||||
if (mType instanceof Int32Type) {
|
||||
return TypeUtils.makeNullable(TypeName.INT, mNullable);
|
||||
}
|
||||
if (mType instanceof FloatType) {
|
||||
return TypeUtils.makeNullable(TypeName.FLOAT, mNullable);
|
||||
}
|
||||
if (mType instanceof DoubleType) {
|
||||
return TypeUtils.makeNullable(TypeName.DOUBLE, mNullable);
|
||||
}
|
||||
throw new CodegenException("Unsupported NumberType: " + mType.getClass());
|
||||
}
|
||||
}
|
||||
|
||||
+36
-6
@@ -7,32 +7,62 @@
|
||||
|
||||
package com.facebook.react.codegen.generator.resolver;
|
||||
|
||||
import com.facebook.react.codegen.generator.model.CodegenException;
|
||||
import com.facebook.react.codegen.generator.model.ObjectType;
|
||||
import com.facebook.react.codegen.generator.model.TypeData;
|
||||
import com.squareup.javapoet.TypeName;
|
||||
import com.squareup.javapoet.TypeSpec;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public final class ObjectResolvedType extends ResolvedType<ObjectType> {
|
||||
private final Map<String, ResolvedType> mResolvedPropertyTypes;
|
||||
|
||||
private ObjectResolvedType(final ObjectType type, final boolean nullable) {
|
||||
private ObjectResolvedType(
|
||||
final ObjectType type, final TypeData typeData, final boolean nullable) {
|
||||
super(type, nullable);
|
||||
mResolvedPropertyTypes =
|
||||
Collections.unmodifiableMap(
|
||||
type.properties.stream()
|
||||
.collect(
|
||||
Collectors.toMap(
|
||||
item -> item.name,
|
||||
// TODO: Optional Object property is not necessarily nullable.
|
||||
item -> resolveType(item.type, typeData, item.optional))));
|
||||
}
|
||||
|
||||
public static ObjectResolvedType create(
|
||||
final ObjectType type, final TypeData typeData, final boolean nullable) {
|
||||
return new ObjectResolvedType(type, nullable);
|
||||
return new ObjectResolvedType(type, typeData, nullable);
|
||||
}
|
||||
|
||||
public Map<String, ResolvedType> getResolvedPropertyTypes() {
|
||||
return mResolvedPropertyTypes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TypeName getNativeType(final NativeTypeContext typeContext) {
|
||||
// TODO
|
||||
return TypeName.VOID;
|
||||
// TODO: It should return its own class type.
|
||||
// However, the NativeModule system only supports built-in ReadableMap/WritableMap for now.
|
||||
switch (typeContext) {
|
||||
case FUNCTION_ARGUMENT:
|
||||
return TypeUtils.makeNullable(ReactClassNames.REACT_READABLE_MAP, mNullable);
|
||||
case FUNCTION_RETURN:
|
||||
return TypeUtils.makeNullable(ReactClassNames.REACT_WRITABLE_MAP, mNullable);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
throw new CodegenException(
|
||||
"Unsupported ObjectType: " + mType + " - typeContext: " + typeContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable TypeSpec getGeneratedCode(final String packageName) {
|
||||
// TODO
|
||||
throw new UnsupportedOperationException();
|
||||
// TODO: Object type should produce is own class to represent its shape.
|
||||
// However, the NativeModule system only supports built-in ReadableMap/WritableMap for now.
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
+1
-10
@@ -10,8 +10,6 @@ package com.facebook.react.codegen.generator.resolver;
|
||||
import com.facebook.react.codegen.generator.model.PromiseType;
|
||||
import com.facebook.react.codegen.generator.model.TypeData;
|
||||
import com.squareup.javapoet.TypeName;
|
||||
import com.squareup.javapoet.TypeSpec;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public final class PromiseResolvedType extends ResolvedType<PromiseType> {
|
||||
|
||||
@@ -26,13 +24,6 @@ public final class PromiseResolvedType extends ResolvedType<PromiseType> {
|
||||
|
||||
@Override
|
||||
public TypeName getNativeType(final NativeTypeContext typeContext) {
|
||||
// TODO
|
||||
return TypeName.VOID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable TypeSpec getGeneratedCode(final String packageName) {
|
||||
// TODO
|
||||
throw new UnsupportedOperationException();
|
||||
return TypeUtils.makeNullable(ReactClassNames.REACT_PROMISE, mNullable);
|
||||
}
|
||||
}
|
||||
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
package com.facebook.react.codegen.generator.resolver;
|
||||
|
||||
import com.squareup.javapoet.ClassName;
|
||||
|
||||
/** Names of React-specific Java classes required by generated code. */
|
||||
public class ReactClassNames {
|
||||
|
||||
public static final ClassName REACT_APPLICATION_CONTEXT =
|
||||
ClassName.bestGuess("com.facebook.react.bridge.ReactApplicationContext");
|
||||
public static final ClassName REACT_CALLBACK =
|
||||
ClassName.bestGuess("com.facebook.react.bridge.Callback");
|
||||
public static final ClassName REACT_CONTEXT_BASE_JAVA_MODULE =
|
||||
ClassName.bestGuess("com.facebook.react.bridge.ReactContextBaseJavaModule");
|
||||
public static final ClassName REACT_METHOD =
|
||||
ClassName.bestGuess("com.facebook.react.bridge.ReactMethod");
|
||||
public static final ClassName REACT_MODULE_WITH_SPEC =
|
||||
ClassName.bestGuess("com.facebook.react.bridge.ReactModuleWithSpec");
|
||||
public static final ClassName REACT_PROMISE =
|
||||
ClassName.bestGuess("com.facebook.react.bridge.Promise");
|
||||
public static final ClassName REACT_READABLE_ARRAY =
|
||||
ClassName.bestGuess("com.facebook.react.bridge.ReadableArray");
|
||||
public static final ClassName REACT_READABLE_MAP =
|
||||
ClassName.bestGuess("com.facebook.react.bridge.ReadableMap");
|
||||
public static final ClassName REACT_WRITABLE_ARRAY =
|
||||
ClassName.bestGuess("com.facebook.react.bridge.WritableArray");
|
||||
public static final ClassName REACT_WRITABLE_MAP =
|
||||
ClassName.bestGuess("com.facebook.react.bridge.WritableMap");
|
||||
public static final ClassName REACT_BUILD_CONFIG =
|
||||
ClassName.bestGuess("com.facebook.react.common.build.ReactBuildConfig");
|
||||
public static final ClassName REACT_TURBOMODULE =
|
||||
ClassName.bestGuess("com.facebook.react.turbomodule.core.interfaces.TurboModule");
|
||||
}
|
||||
+13
-5
@@ -7,6 +7,8 @@
|
||||
|
||||
package com.facebook.react.codegen.generator.resolver;
|
||||
|
||||
import com.facebook.react.codegen.generator.model.CodegenException;
|
||||
import com.facebook.react.codegen.generator.model.DoubleType;
|
||||
import com.facebook.react.codegen.generator.model.ReservedFunctionValueType;
|
||||
import com.facebook.react.codegen.generator.model.TypeData;
|
||||
import com.squareup.javapoet.TypeName;
|
||||
@@ -19,22 +21,28 @@ public final class ReservedFunctionValueResolvedType
|
||||
private ReservedFunctionValueResolvedType(
|
||||
final ReservedFunctionValueType type, final boolean nullable) {
|
||||
super(type, nullable);
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public static ReservedFunctionValueResolvedType create(
|
||||
public static ResolvedType create(
|
||||
final ReservedFunctionValueType type, final TypeData typeData, final boolean nullable) {
|
||||
return new ReservedFunctionValueResolvedType(type, nullable);
|
||||
switch (type.reservedName) {
|
||||
case RootTag:
|
||||
return resolveType(new DoubleType(type.getTypeId()), typeData, nullable);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
throw new CodegenException("Unsupported ReservedFunctionValueType: " + type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TypeName getNativeType(final NativeTypeContext typeContext) {
|
||||
// TODO
|
||||
return TypeName.VOID;
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable TypeSpec getGeneratedCode(final String packageName) {
|
||||
// TODO
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
||||
|
||||
+2
-10
@@ -9,9 +9,8 @@ package com.facebook.react.codegen.generator.resolver;
|
||||
|
||||
import com.facebook.react.codegen.generator.model.StringType;
|
||||
import com.facebook.react.codegen.generator.model.TypeData;
|
||||
import com.squareup.javapoet.ClassName;
|
||||
import com.squareup.javapoet.TypeName;
|
||||
import com.squareup.javapoet.TypeSpec;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public final class StringResolvedType extends ResolvedType<StringType> {
|
||||
|
||||
@@ -26,13 +25,6 @@ public final class StringResolvedType extends ResolvedType<StringType> {
|
||||
|
||||
@Override
|
||||
public TypeName getNativeType(final NativeTypeContext typeContext) {
|
||||
// TODO
|
||||
return TypeName.VOID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable TypeSpec getGeneratedCode(final String packageName) {
|
||||
// TODO
|
||||
throw new UnsupportedOperationException();
|
||||
return TypeUtils.makeNullable(ClassName.get(String.class), mNullable);
|
||||
}
|
||||
}
|
||||
|
||||
-1
@@ -27,7 +27,6 @@ import com.facebook.react.codegen.generator.model.VoidType;
|
||||
public final class TypeResolver {
|
||||
public static ResolvedType resolveType(
|
||||
final Type type, final TypeData typeData, final boolean nullable) {
|
||||
System.out.println("Resolving: " + type);
|
||||
|
||||
if (type instanceof AliasType) {
|
||||
return AliasResolvedType.create((AliasType) type, typeData, nullable);
|
||||
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
package com.facebook.react.codegen.generator.resolver;
|
||||
|
||||
import com.squareup.javapoet.AnnotationSpec;
|
||||
import com.squareup.javapoet.ParameterizedTypeName;
|
||||
import com.squareup.javapoet.TypeName;
|
||||
import com.squareup.javapoet.TypeVariableName;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public class TypeUtils {
|
||||
|
||||
public static class Annotations {
|
||||
public static final AnnotationSpec OVERRIDE = AnnotationSpec.builder(Override.class).build();
|
||||
public static final AnnotationSpec NULLABLE = AnnotationSpec.builder(Nullable.class).build();
|
||||
}
|
||||
|
||||
public static TypeName getNativeClassName(TypeName className) {
|
||||
while (className instanceof ParameterizedTypeName) {
|
||||
className = ((ParameterizedTypeName) className).rawType;
|
||||
}
|
||||
|
||||
return (className instanceof TypeVariableName) ? TypeName.OBJECT : className.box();
|
||||
}
|
||||
|
||||
public static TypeName makeNullable(TypeName typeName, boolean isNullable) {
|
||||
if (isNullable) {
|
||||
if (typeName.isPrimitive()) {
|
||||
return typeName.box();
|
||||
}
|
||||
if (!typeName.annotations.contains(Annotations.NULLABLE)) {
|
||||
return typeName.annotated(Annotations.NULLABLE);
|
||||
}
|
||||
}
|
||||
return typeName;
|
||||
}
|
||||
}
|
||||
+1
-3
@@ -26,13 +26,11 @@ public final class VoidResolvedType extends ResolvedType<VoidType> {
|
||||
|
||||
@Override
|
||||
public TypeName getNativeType(final NativeTypeContext typeContext) {
|
||||
// TODO
|
||||
return TypeName.VOID;
|
||||
return TypeUtils.makeNullable(TypeName.VOID, mNullable);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable TypeSpec getGeneratedCode(final String packageName) {
|
||||
// TODO
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user