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:
Kevin Gozali
2020-08-25 10:38:14 -07:00
committed by Facebook GitHub Bot
parent eda1f8da7b
commit 8fc1646c75
23 changed files with 312 additions and 146 deletions
@@ -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);
}
}
@@ -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);
@@ -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);
}
}
@@ -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;
}
}
@@ -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) {
@@ -20,4 +20,9 @@ public final class ReservedFunctionValueType extends Type {
super(typeId);
this.reservedName = reservedName;
}
@Override
public String toString() {
return mTypeId + "(" + reservedName.toString() + ")";
}
}
@@ -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();
}
}
@@ -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);
}
}
}
@@ -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);
}
}
}
@@ -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);
}
}
@@ -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);
}
}
@@ -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);
}
}
@@ -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();
}
}
@@ -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();
}
}
@@ -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());
}
}
@@ -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;
}
}
@@ -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);
}
}
@@ -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");
}
@@ -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();
}
}
@@ -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);
}
}
@@ -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);
@@ -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;
}
}
@@ -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();
}
}