Skip to content

Commit

Permalink
feat: draft support for aliases
Browse files Browse the repository at this point in the history
This needs dogfooding and probably some more adjustments.

Closes #199
  • Loading branch information
TheMrMilchmann committed Feb 16, 2023
1 parent 35d1817 commit f3fa865
Show file tree
Hide file tree
Showing 25 changed files with 262 additions and 132 deletions.
50 changes: 24 additions & 26 deletions api/api-generator.api
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ public final class com/gw2tb/apigen/ir/IRAlias : com/gw2tb/apigen/ir/IRTypeDecla
}

public final class com/gw2tb/apigen/ir/IRArray : com/gw2tb/apigen/ir/IRTypeUse {
public fun <init> (Lcom/gw2tb/apigen/ir/IRTypeUse;ZLjava/lang/String;)V
public final fun component1 ()Lcom/gw2tb/apigen/ir/IRTypeUse;
public final fun component2 ()Z
public final fun component3 ()Ljava/lang/String;
Expand Down Expand Up @@ -104,23 +103,22 @@ public final class com/gw2tb/apigen/ir/IRDecimal : com/gw2tb/apigen/ir/IRPrimiti

public final class com/gw2tb/apigen/ir/IREnum : com/gw2tb/apigen/ir/IRTypeDeclaration {
public final fun component1 ()Lcom/gw2tb/apigen/model/Name;
public final fun component2 ()Lcom/gw2tb/apigen/ir/IRPrimitive;
public final fun component2 ()Lcom/gw2tb/apigen/ir/IRPrimitiveOrAlias;
public final fun component3 ()Ljava/util/Set;
public final fun component4 ()Ljava/lang/String;
public final fun copy (Lcom/gw2tb/apigen/model/Name;Lcom/gw2tb/apigen/ir/IRPrimitive;Ljava/util/Set;Ljava/lang/String;)Lcom/gw2tb/apigen/ir/IREnum;
public static synthetic fun copy$default (Lcom/gw2tb/apigen/ir/IREnum;Lcom/gw2tb/apigen/model/Name;Lcom/gw2tb/apigen/ir/IRPrimitive;Ljava/util/Set;Ljava/lang/String;ILjava/lang/Object;)Lcom/gw2tb/apigen/ir/IREnum;
public final fun copy (Lcom/gw2tb/apigen/model/Name;Lcom/gw2tb/apigen/ir/IRPrimitiveOrAlias;Ljava/util/Set;Ljava/lang/String;)Lcom/gw2tb/apigen/ir/IREnum;
public static synthetic fun copy$default (Lcom/gw2tb/apigen/ir/IREnum;Lcom/gw2tb/apigen/model/Name;Lcom/gw2tb/apigen/ir/IRPrimitiveOrAlias;Ljava/util/Set;Ljava/lang/String;ILjava/lang/Object;)Lcom/gw2tb/apigen/ir/IREnum;
public fun equals (Ljava/lang/Object;)Z
public final fun getDescription ()Ljava/lang/String;
public fun getName ()Lcom/gw2tb/apigen/model/Name;
public final fun getType ()Lcom/gw2tb/apigen/ir/IRPrimitive;
public final fun getType ()Lcom/gw2tb/apigen/ir/IRPrimitiveOrAlias;
public final fun getValues ()Ljava/util/Set;
public fun hashCode ()I
public synthetic fun resolve$api_generator (Lcom/gw2tb/apigen/ir/ResolverContext;Lcom/gw2tb/apigen/model/v2/SchemaVersion;)Lcom/gw2tb/apigen/schema/SchemaTypeDeclaration;
public fun toString ()Ljava/lang/String;
}

public final class com/gw2tb/apigen/ir/IREnum$Value {
public fun <init> (Lcom/gw2tb/apigen/model/Name;Ljava/lang/String;Ljava/lang/String;)V
public final fun component1 ()Lcom/gw2tb/apigen/model/Name;
public final fun component2 ()Ljava/lang/String;
public final fun component3 ()Ljava/lang/String;
Expand All @@ -139,24 +137,23 @@ public final class com/gw2tb/apigen/ir/IRInteger : com/gw2tb/apigen/ir/IRPrimiti
}

public final class com/gw2tb/apigen/ir/IRMap : com/gw2tb/apigen/ir/IRTypeUse {
public fun <init> (Lcom/gw2tb/apigen/ir/IRPrimitive;Lcom/gw2tb/apigen/ir/IRTypeUse;ZLjava/lang/String;)V
public final fun component1 ()Lcom/gw2tb/apigen/ir/IRPrimitive;
public final fun component1 ()Lcom/gw2tb/apigen/ir/IRPrimitiveOrAlias;
public final fun component2 ()Lcom/gw2tb/apigen/ir/IRTypeUse;
public final fun component3 ()Z
public final fun component4 ()Ljava/lang/String;
public final fun copy (Lcom/gw2tb/apigen/ir/IRPrimitive;Lcom/gw2tb/apigen/ir/IRTypeUse;ZLjava/lang/String;)Lcom/gw2tb/apigen/ir/IRMap;
public static synthetic fun copy$default (Lcom/gw2tb/apigen/ir/IRMap;Lcom/gw2tb/apigen/ir/IRPrimitive;Lcom/gw2tb/apigen/ir/IRTypeUse;ZLjava/lang/String;ILjava/lang/Object;)Lcom/gw2tb/apigen/ir/IRMap;
public final fun copy (Lcom/gw2tb/apigen/ir/IRPrimitiveOrAlias;Lcom/gw2tb/apigen/ir/IRTypeUse;ZLjava/lang/String;)Lcom/gw2tb/apigen/ir/IRMap;
public static synthetic fun copy$default (Lcom/gw2tb/apigen/ir/IRMap;Lcom/gw2tb/apigen/ir/IRPrimitiveOrAlias;Lcom/gw2tb/apigen/ir/IRTypeUse;ZLjava/lang/String;ILjava/lang/Object;)Lcom/gw2tb/apigen/ir/IRMap;
public fun equals (Ljava/lang/Object;)Z
public final fun getDescription ()Ljava/lang/String;
public final fun getKeys ()Lcom/gw2tb/apigen/ir/IRPrimitive;
public final fun getKeys ()Lcom/gw2tb/apigen/ir/IRPrimitiveOrAlias;
public final fun getNullableValues ()Z
public final fun getValues ()Lcom/gw2tb/apigen/ir/IRTypeUse;
public fun hashCode ()I
public synthetic fun resolve$api_generator (Lcom/gw2tb/apigen/ir/ResolverContext;Lcom/gw2tb/apigen/model/v2/SchemaVersion;)Lcom/gw2tb/apigen/schema/SchemaTypeUse;
public fun toString ()Ljava/lang/String;
}

public abstract class com/gw2tb/apigen/ir/IRPrimitive : com/gw2tb/apigen/ir/IRTypeUse {
public abstract class com/gw2tb/apigen/ir/IRPrimitive : com/gw2tb/apigen/ir/IRTypeUse, com/gw2tb/apigen/ir/IRPrimitiveOrAlias {
public synthetic fun <init> (Lcom/gw2tb/apigen/schema/SchemaPrimitive;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
protected fun getSchema ()Lcom/gw2tb/apigen/schema/SchemaPrimitive;
public synthetic fun resolve$api_generator (Lcom/gw2tb/apigen/ir/ResolverContext;Lcom/gw2tb/apigen/model/v2/SchemaVersion;)Lcom/gw2tb/apigen/schema/SchemaTypeUse;
Expand All @@ -171,6 +168,9 @@ public abstract class com/gw2tb/apigen/ir/IRPrimitiveIdentifier : com/gw2tb/apig
public synthetic fun resolve$api_generator (Lcom/gw2tb/apigen/ir/ResolverContext;Lcom/gw2tb/apigen/model/v2/SchemaVersion;)Lcom/gw2tb/apigen/schema/SchemaTypeUse;
}

public abstract interface class com/gw2tb/apigen/ir/IRPrimitiveOrAlias {
}

public final class com/gw2tb/apigen/ir/IRProperty {
public final fun component1 ()Lcom/gw2tb/apigen/model/Name;
public final fun component10 ()Lcom/gw2tb/apigen/model/v2/SchemaVersion;
Expand Down Expand Up @@ -236,7 +236,6 @@ public final class com/gw2tb/apigen/ir/IRTuple : com/gw2tb/apigen/ir/IRTypeDecla
}

public final class com/gw2tb/apigen/ir/IRTuple$Element {
public fun <init> (Lcom/gw2tb/apigen/model/Name;Lcom/gw2tb/apigen/ir/IRTypeUse;Ljava/lang/String;ZZ)V
public final fun component1 ()Lcom/gw2tb/apigen/model/Name;
public final fun component2 ()Lcom/gw2tb/apigen/ir/IRTypeUse;
public final fun component3 ()Ljava/lang/String;
Expand Down Expand Up @@ -772,7 +771,6 @@ public abstract interface class com/gw2tb/apigen/model/v2/SchemaVersionedData {
}

public final class com/gw2tb/apigen/schema/SchemaAlias : com/gw2tb/apigen/schema/SchemaTypeDeclaration {
public fun <init> (Lcom/gw2tb/apigen/model/Name;Lcom/gw2tb/apigen/schema/SchemaPrimitive;Ljava/lang/String;)V
public final fun component1 ()Lcom/gw2tb/apigen/model/Name;
public final fun component2 ()Lcom/gw2tb/apigen/schema/SchemaPrimitive;
public final fun component3 ()Ljava/lang/String;
Expand Down Expand Up @@ -852,24 +850,22 @@ public final class com/gw2tb/apigen/schema/SchemaDecimal : com/gw2tb/apigen/sche
}

public final class com/gw2tb/apigen/schema/SchemaEnum : com/gw2tb/apigen/schema/SchemaTypeDeclaration {
public fun <init> (Lcom/gw2tb/apigen/model/Name;Lcom/gw2tb/apigen/schema/SchemaPrimitive;Ljava/util/Set;Ljava/lang/String;)V
public final fun component1 ()Lcom/gw2tb/apigen/model/Name;
public final fun component2 ()Lcom/gw2tb/apigen/schema/SchemaPrimitive;
public final fun component2 ()Lcom/gw2tb/apigen/schema/SchemaPrimitiveOrAlias;
public final fun component3 ()Ljava/util/Set;
public final fun component4 ()Ljava/lang/String;
public final fun copy (Lcom/gw2tb/apigen/model/Name;Lcom/gw2tb/apigen/schema/SchemaPrimitive;Ljava/util/Set;Ljava/lang/String;)Lcom/gw2tb/apigen/schema/SchemaEnum;
public static synthetic fun copy$default (Lcom/gw2tb/apigen/schema/SchemaEnum;Lcom/gw2tb/apigen/model/Name;Lcom/gw2tb/apigen/schema/SchemaPrimitive;Ljava/util/Set;Ljava/lang/String;ILjava/lang/Object;)Lcom/gw2tb/apigen/schema/SchemaEnum;
public final fun copy (Lcom/gw2tb/apigen/model/Name;Lcom/gw2tb/apigen/schema/SchemaPrimitiveOrAlias;Ljava/util/Set;Ljava/lang/String;)Lcom/gw2tb/apigen/schema/SchemaEnum;
public static synthetic fun copy$default (Lcom/gw2tb/apigen/schema/SchemaEnum;Lcom/gw2tb/apigen/model/Name;Lcom/gw2tb/apigen/schema/SchemaPrimitiveOrAlias;Ljava/util/Set;Ljava/lang/String;ILjava/lang/Object;)Lcom/gw2tb/apigen/schema/SchemaEnum;
public fun equals (Ljava/lang/Object;)Z
public final fun getDescription ()Ljava/lang/String;
public fun getName ()Lcom/gw2tb/apigen/model/Name;
public final fun getType ()Lcom/gw2tb/apigen/schema/SchemaPrimitive;
public final fun getType ()Lcom/gw2tb/apigen/schema/SchemaPrimitiveOrAlias;
public final fun getValues ()Ljava/util/Set;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class com/gw2tb/apigen/schema/SchemaEnum$Value {
public fun <init> (Lcom/gw2tb/apigen/model/Name;Ljava/lang/String;Ljava/lang/String;)V
public final fun component1 ()Lcom/gw2tb/apigen/model/Name;
public final fun component2 ()Ljava/lang/String;
public final fun component3 ()Ljava/lang/String;
Expand All @@ -888,29 +884,32 @@ public final class com/gw2tb/apigen/schema/SchemaInteger : com/gw2tb/apigen/sche
}

public final class com/gw2tb/apigen/schema/SchemaMap : com/gw2tb/apigen/schema/SchemaTypeUse {
public final fun component1 ()Lcom/gw2tb/apigen/schema/SchemaPrimitive;
public final fun component1 ()Lcom/gw2tb/apigen/schema/SchemaPrimitiveOrAlias;
public final fun component2 ()Lcom/gw2tb/apigen/schema/SchemaTypeUse;
public final fun component3 ()Z
public final fun component4 ()Ljava/lang/String;
public final fun copy (Lcom/gw2tb/apigen/schema/SchemaPrimitive;Lcom/gw2tb/apigen/schema/SchemaTypeUse;ZLjava/lang/String;)Lcom/gw2tb/apigen/schema/SchemaMap;
public static synthetic fun copy$default (Lcom/gw2tb/apigen/schema/SchemaMap;Lcom/gw2tb/apigen/schema/SchemaPrimitive;Lcom/gw2tb/apigen/schema/SchemaTypeUse;ZLjava/lang/String;ILjava/lang/Object;)Lcom/gw2tb/apigen/schema/SchemaMap;
public final fun copy (Lcom/gw2tb/apigen/schema/SchemaPrimitiveOrAlias;Lcom/gw2tb/apigen/schema/SchemaTypeUse;ZLjava/lang/String;)Lcom/gw2tb/apigen/schema/SchemaMap;
public static synthetic fun copy$default (Lcom/gw2tb/apigen/schema/SchemaMap;Lcom/gw2tb/apigen/schema/SchemaPrimitiveOrAlias;Lcom/gw2tb/apigen/schema/SchemaTypeUse;ZLjava/lang/String;ILjava/lang/Object;)Lcom/gw2tb/apigen/schema/SchemaMap;
public fun equals (Ljava/lang/Object;)Z
public final fun getDescription ()Ljava/lang/String;
public final fun getKeys ()Lcom/gw2tb/apigen/schema/SchemaPrimitive;
public final fun getKeys ()Lcom/gw2tb/apigen/schema/SchemaPrimitiveOrAlias;
public final fun getNullableValues ()Z
public final fun getValues ()Lcom/gw2tb/apigen/schema/SchemaTypeUse;
public fun hashCode ()I
public fun isLocalized ()Z
public fun toString ()Ljava/lang/String;
}

public abstract class com/gw2tb/apigen/schema/SchemaPrimitive : com/gw2tb/apigen/schema/SchemaTypeUse {
public abstract class com/gw2tb/apigen/schema/SchemaPrimitive : com/gw2tb/apigen/schema/SchemaTypeUse, com/gw2tb/apigen/schema/SchemaPrimitiveOrAlias {
public fun isLocalized ()Z
}

public abstract class com/gw2tb/apigen/schema/SchemaPrimitiveIdentifier : com/gw2tb/apigen/schema/SchemaPrimitive {
}

public abstract interface class com/gw2tb/apigen/schema/SchemaPrimitiveOrAlias {
}

public final class com/gw2tb/apigen/schema/SchemaProperty {
public final fun component1 ()Lcom/gw2tb/apigen/model/Name;
public final fun component2 ()Lcom/gw2tb/apigen/schema/SchemaTypeUse;
Expand Down Expand Up @@ -970,7 +969,6 @@ public final class com/gw2tb/apigen/schema/SchemaTuple : com/gw2tb/apigen/schema
}

public final class com/gw2tb/apigen/schema/SchemaTuple$Element {
public fun <init> (Lcom/gw2tb/apigen/model/Name;Lcom/gw2tb/apigen/schema/SchemaTypeUse;Ljava/lang/String;ZZ)V
public final fun component1 ()Lcom/gw2tb/apigen/model/Name;
public final fun component2 ()Lcom/gw2tb/apigen/schema/SchemaTypeUse;
public final fun component3 ()Ljava/lang/String;
Expand Down
22 changes: 11 additions & 11 deletions src/main/kotlin/com/gw2tb/apigen/internal/dsl/QueriesBuilder.kt
Original file line number Diff line number Diff line change
Expand Up @@ -34,38 +34,38 @@ internal interface QueriesBuilder<T : IRAPIType> {

fun pathParameter(
name: String,
type: DeferredSchemaType<out IRPrimitive>,
type: DeferredPrimitiveType<*>,
description: String,
key: String = name,
camelCase: String = name.firstToLowerCase()
)

fun queryParameter(
name: String,
type: DeferredSchemaType<out IRPrimitive>,
type: DeferredPrimitiveType<*>,
description: String,
key: String = name.lowercase(),
camelCase: String = name.firstToLowerCase(),
isOptional: Boolean = false
)

fun schema(schema: DeferredSchemaType<out IRTypeUse<*>>)
fun schema(schema: DeferredType<IRTypeUse<*>>)

fun array(
items: DeferredSchemaType<out IRTypeUse<*>>,
items: DeferredType<IRTypeUse<*>>,
description: String,
nullableItems: Boolean = false
): DeferredSchemaType<IRArray> =
): DeferredType<IRArray> =
DeferredSchemaType { typeRegistry, isTopLevel ->
items.get(typeRegistry, interpretationHint = null, isTopLevel).mapData { IRArray(it, nullableItems, description) }
}

fun map(
keys: DeferredSchemaType<out IRPrimitive>,
values: DeferredSchemaType<out IRTypeUse<*>>,
keys: DeferredType<IRPrimitive>,
values: DeferredType<IRTypeUse<*>>,
description: String,
nullableValues: Boolean = false
): DeferredSchemaType<IRMap> =
): DeferredType<IRMap> =
DeferredSchemaType { typeRegistry, isTopLevel ->
values.get(typeRegistry, interpretationHint = null, isTopLevel).mapData { IRMap(keys.getFlat(), it, nullableValues, description) }
}
Expand Down Expand Up @@ -99,10 +99,10 @@ internal interface QueriesBuilder<T : IRAPIType> {
): DeferredSchemaClass<T>


fun enum(type: DeferredPrimitiveType, name: String, description: String, block: SchemaEnumBuilder<T>.() -> Unit): DeferredSchemaClass<T> =
fun enum(type: DeferredPrimitiveType<*>, name: String, description: String, block: SchemaEnumBuilder<T>.() -> Unit): DeferredSchemaClass<T> =
enum(type, Name.deriveFromTitleCase(name), description, block)

fun enum(type: DeferredPrimitiveType, name: Name, description: String, block: SchemaEnumBuilder<T>.() -> Unit): DeferredSchemaClass<T>
fun enum(type: DeferredPrimitiveType<*>, name: Name, description: String, block: SchemaEnumBuilder<T>.() -> Unit): DeferredSchemaClass<T>


fun record(name: String, description: String, block: SchemaRecordBuilder<T>.() -> Unit): DeferredSchemaClass<T> =
Expand All @@ -126,6 +126,6 @@ internal interface QueriesBuilderV1 : QueriesBuilder<IRAPIType.V1>
@OptIn(LowLevelApiGenApi::class)
internal interface QueriesBuilderV2 : QueriesBuilder<IRAPIType.V2> {

fun schema(vararg schemas: Pair<SchemaVersion, DeferredSchemaType<out IRTypeUse<*>>>)
fun schema(vararg schemas: Pair<SchemaVersion, DeferredType<IRTypeUse<*>>>)

}
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ internal class SchemaConditionalBuilder<T : IRAPIType>(
val loc = typeRegistry?.getQualifiedDeclarationName(name) ?: error("TypeRegistry is required")
val interpretations = buildInterpretations(loc, nestedTypeRegistry)

val versions = buildVersionedSchemaData<IRConditional> {
val versions = buildVersionedSchemaData {
SchemaVersion.values()
.filter { version -> version == SchemaVersion.V2_SCHEMA_CLASSIC || interpretations.hasChangedInVersion(version) || sharedProperties?.hasChangedInVersion(version) == true }
.zipSchemaVersionConstraints()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ import com.gw2tb.apigen.model.v2.SchemaVersion
internal class SchemaConditionalInterpretationBuilder constructor(
private val interpretationKey: String,
private val interpretationNestProperty: String,
private val type: DeferredSchemaType<out IRTypeUse<*>>
private val type: DeferredType<IRTypeUse<*>>
) {

var isDeprecated = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ import com.gw2tb.apigen.model.v2.SchemaVersion
import com.gw2tb.apigen.model.Name

internal class SchemaEnumBuilder<T : IRAPIType>(
private val type: DeferredPrimitiveType,
private val type: DeferredPrimitiveType<*>,
override val name: Name,
private val description: String,
override val apiTypeFactory: (SchemaVersionedDataImpl<out IRTypeDeclaration<*>>, APIType.InterpretationHint?, Boolean) -> T,
Expand Down Expand Up @@ -76,15 +76,15 @@ internal class SchemaEnumBuilder<T : IRAPIType>(
val type = type.get(typeRegistry, interpretationHint = null)
val enumValues = buildEnumValues()

val versions = buildVersionedSchemaData<IREnum> {
val versions = buildVersionedSchemaData {
SchemaVersion.values()
.filter { version -> version == SchemaVersion.V2_SCHEMA_CLASSIC || enumValues?.hasChangedInVersion(version) == true }
.zipSchemaVersionConstraints()
.forEach { (since, until) ->
add(
datum = IREnum(
name = name,
type = type.getOrThrow(since).data,
type = type.getOrThrow(since).data as IRPrimitiveOrAlias,
values = enumValues?.getOrThrow(since)?.data ?: emptySet(),
description = description
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ internal class SchemaRecordBuilder<T : IRAPIType>(

val properties: SchemaVersionedDataImpl<Map<String, IRProperty>>? = buildProperties(typeRegistry?.nestedScope(name))

val versions = buildVersionedSchemaData<IRRecord> {
val versions = buildVersionedSchemaData {
SchemaVersion.values()
.filter { version -> version == SchemaVersion.V2_SCHEMA_CLASSIC || properties?.hasChangedInVersion(version) == true }
.zipSchemaVersionConstraints()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ import com.gw2tb.apigen.model.Optionality

internal class SchemaRecordPropertyBuilder(
private val nameTitleCase: String,
private val type: DeferredSchemaType<out IRTypeUse<*>>,
private val type: DeferredType<IRTypeUse<*>>,
private val description: String
) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ internal class SchemaTupleBuilder<T : IRAPIType>(

val elements: SchemaVersionedDataImpl<Set<IRTuple.Element>>? = buildElements(typeRegistry?.nestedScope(name))

val versions = buildVersionedSchemaData<IRTuple> {
val versions = buildVersionedSchemaData {
SchemaVersion.values()
.filter { version -> version == SchemaVersion.V2_SCHEMA_CLASSIC || elements?.hasChangedInVersion(version) == true }
.zipSchemaVersionConstraints()
Expand Down Expand Up @@ -98,7 +98,7 @@ internal class SchemaTupleBuilder<T : IRAPIType>(
return _value
}

operator fun String.invoke(type: DeferredSchemaType<out IRTypeUse<*>>, description: String): SchemaTupleElementBuilder =
operator fun String.invoke(type: DeferredType<IRTypeUse<*>>, description: String): SchemaTupleElementBuilder =
SchemaTupleElementBuilder(this, type, description).also { _elements += it }

}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import com.gw2tb.apigen.model.Name

internal class SchemaTupleElementBuilder(
val nameTitleCase: String,
val type: DeferredSchemaType<out IRTypeUse<*>>,
val type: DeferredType<IRTypeUse<*>>,
val description: String
) {

Expand Down
Loading

0 comments on commit f3fa865

Please sign in to comment.