From e507d5417a306513f98169c4bda071e8fbf5aa40 Mon Sep 17 00:00:00 2001
From: Weidong Xu
Date: Fri, 23 Feb 2024 14:49:13 +0800
Subject: [PATCH 1/2] tsp, discrimintor value as enum
---
typespec-extension/src/code-model-builder.ts | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/typespec-extension/src/code-model-builder.ts b/typespec-extension/src/code-model-builder.ts
index ea91941ac7..a8515ac7c2 100644
--- a/typespec-extension/src/code-model-builder.ts
+++ b/typespec-extension/src/code-model-builder.ts
@@ -2137,9 +2137,6 @@ export class CodeModelBuilder {
}
if (discriminatorProperty) {
objectSchema.discriminator = new Discriminator(this.processModelProperty(discriminatorProperty));
- // as we do not expose the discriminator property, its schema is fine to be just a string (and we do not want to generate an enum that not used anywhere)
- // TODO: support enum schema, if we expose the discriminator property
- objectSchema.discriminator.property.schema = this.stringSchema;
} else {
// fallback to property name, if cannot find the discriminator property
objectSchema.discriminator = new Discriminator(
@@ -2810,6 +2807,10 @@ export class CodeModelBuilder {
schema.children?.all?.forEach((c) => innerApplySchemaUsage(c, schemaUsage));
schema.children?.immediate?.forEach((c) => innerApplySchemaUsage(c, schemaUsage));
+
+ if (schema.discriminator?.property?.schema) {
+ innerApplySchemaUsage(schema.discriminator?.property?.schema, schemaUsage);
+ }
}
// Object.values(schema.discriminator?.all ?? {}).forEach((d) => {
From aaa0ce022cc4ffb5b2253425808f4194bc9d30b7 Mon Sep 17 00:00:00 2001
From: actions-user
Date: Fri, 23 Feb 2024 06:59:23 +0000
Subject: [PATCH 2/2] re-generate test code
---
.../EnumDiscriminatorAsyncClient.java | 16 +++---
.../EnumDiscriminatorClient.java | 16 +++---
.../EnumDiscriminatorClientImpl.java | 32 ++++++------
.../enumdiscriminator/models/Cobra.java | 8 +--
.../enumdiscriminator/models/Dog.java | 14 ++---
.../enumdiscriminator/models/DogKind.java | 51 +++++++++++++++++++
.../enumdiscriminator/models/Golden.java | 8 +--
.../enumdiscriminator/models/Snake.java | 14 ++---
.../enumdiscriminator/models/SnakeKind.java | 51 +++++++++++++++++++
9 files changed, 156 insertions(+), 54 deletions(-)
create mode 100644 typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/DogKind.java
create mode 100644 typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/SnakeKind.java
diff --git a/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/EnumDiscriminatorAsyncClient.java b/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/EnumDiscriminatorAsyncClient.java
index 7812467a29..9300c91ec7 100644
--- a/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/EnumDiscriminatorAsyncClient.java
+++ b/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/EnumDiscriminatorAsyncClient.java
@@ -46,7 +46,7 @@ public final class EnumDiscriminatorAsyncClient {
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(golden) (Optional)
* weight: int (Required)
* }
* }
@@ -72,7 +72,7 @@ public Mono> getExtensibleModelWithResponse(RequestOptions
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(golden) (Optional)
* weight: int (Required)
* }
* }
@@ -98,7 +98,7 @@ public Mono> putExtensibleModelWithResponse(BinaryData input, Req
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(golden) (Optional)
* weight: int (Required)
* }
* }
@@ -124,7 +124,7 @@ public Mono> putExtensibleModelWithResponse(BinaryData input, Req
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(golden) (Optional)
* weight: int (Required)
* }
* }
@@ -150,7 +150,7 @@ public Mono> getExtensibleModelWrongDiscriminatorWithRespon
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(cobra) (Optional)
* length: int (Required)
* }
* }
@@ -176,7 +176,7 @@ public Mono> getFixedModelWithResponse(RequestOptions reque
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(cobra) (Optional)
* length: int (Required)
* }
* }
@@ -202,7 +202,7 @@ public Mono> putFixedModelWithResponse(BinaryData input, RequestO
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(cobra) (Optional)
* length: int (Required)
* }
* }
@@ -227,7 +227,7 @@ public Mono> getFixedModelMissingDiscriminatorWithResponse(
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(cobra) (Optional)
* length: int (Required)
* }
* }
diff --git a/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/EnumDiscriminatorClient.java b/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/EnumDiscriminatorClient.java
index bc1e01bcb9..73ceded856 100644
--- a/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/EnumDiscriminatorClient.java
+++ b/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/EnumDiscriminatorClient.java
@@ -44,7 +44,7 @@ public final class EnumDiscriminatorClient {
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(golden) (Optional)
* weight: int (Required)
* }
* }
@@ -69,7 +69,7 @@ public Response getExtensibleModelWithResponse(RequestOptions reques
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(golden) (Optional)
* weight: int (Required)
* }
* }
@@ -95,7 +95,7 @@ public Response putExtensibleModelWithResponse(BinaryData input, RequestOp
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(golden) (Optional)
* weight: int (Required)
* }
* }
@@ -120,7 +120,7 @@ public Response getExtensibleModelMissingDiscriminatorWithResponse(R
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(golden) (Optional)
* weight: int (Required)
* }
* }
@@ -145,7 +145,7 @@ public Response getExtensibleModelWrongDiscriminatorWithResponse(Req
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(cobra) (Optional)
* length: int (Required)
* }
* }
@@ -170,7 +170,7 @@ public Response getFixedModelWithResponse(RequestOptions requestOpti
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(cobra) (Optional)
* length: int (Required)
* }
* }
@@ -196,7 +196,7 @@ public Response putFixedModelWithResponse(BinaryData input, RequestOptions
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(cobra) (Optional)
* length: int (Required)
* }
* }
@@ -221,7 +221,7 @@ public Response getFixedModelMissingDiscriminatorWithResponse(Reques
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(cobra) (Optional)
* length: int (Required)
* }
* }
diff --git a/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/implementation/EnumDiscriminatorClientImpl.java b/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/implementation/EnumDiscriminatorClientImpl.java
index 415fa9e812..c511e5f60f 100644
--- a/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/implementation/EnumDiscriminatorClientImpl.java
+++ b/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/implementation/EnumDiscriminatorClientImpl.java
@@ -258,7 +258,7 @@ Response getFixedModelWrongDiscriminatorSync(@HeaderParam("accept")
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(golden) (Optional)
* weight: int (Required)
* }
* }
@@ -284,7 +284,7 @@ public Mono> getExtensibleModelWithResponseAsync(RequestOpt
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(golden) (Optional)
* weight: int (Required)
* }
* }
@@ -309,7 +309,7 @@ public Response getExtensibleModelWithResponse(RequestOptions reques
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(golden) (Optional)
* weight: int (Required)
* }
* }
@@ -335,7 +335,7 @@ public Mono> putExtensibleModelWithResponseAsync(BinaryData input
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(golden) (Optional)
* weight: int (Required)
* }
* }
@@ -361,7 +361,7 @@ public Response putExtensibleModelWithResponse(BinaryData input, RequestOp
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(golden) (Optional)
* weight: int (Required)
* }
* }
@@ -388,7 +388,7 @@ public Response putExtensibleModelWithResponse(BinaryData input, RequestOp
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(golden) (Optional)
* weight: int (Required)
* }
* }
@@ -413,7 +413,7 @@ public Response getExtensibleModelMissingDiscriminatorWithResponse(R
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(golden) (Optional)
* weight: int (Required)
* }
* }
@@ -441,7 +441,7 @@ public Response getExtensibleModelMissingDiscriminatorWithResponse(R
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(golden) (Optional)
* weight: int (Required)
* }
* }
@@ -466,7 +466,7 @@ public Response getExtensibleModelWrongDiscriminatorWithResponse(Req
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(cobra) (Optional)
* length: int (Required)
* }
* }
@@ -492,7 +492,7 @@ public Mono> getFixedModelWithResponseAsync(RequestOptions
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(cobra) (Optional)
* length: int (Required)
* }
* }
@@ -517,7 +517,7 @@ public Response getFixedModelWithResponse(RequestOptions requestOpti
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(cobra) (Optional)
* length: int (Required)
* }
* }
@@ -543,7 +543,7 @@ public Mono> putFixedModelWithResponseAsync(BinaryData input, Req
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(cobra) (Optional)
* length: int (Required)
* }
* }
@@ -569,7 +569,7 @@ public Response putFixedModelWithResponse(BinaryData input, RequestOptions
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(cobra) (Optional)
* length: int (Required)
* }
* }
@@ -596,7 +596,7 @@ public Response putFixedModelWithResponse(BinaryData input, RequestOptions
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(cobra) (Optional)
* length: int (Required)
* }
* }
@@ -621,7 +621,7 @@ public Response getFixedModelMissingDiscriminatorWithResponse(Reques
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(cobra) (Optional)
* length: int (Required)
* }
* }
@@ -648,7 +648,7 @@ public Mono> getFixedModelWrongDiscriminatorWithResponseAsy
*
* {@code
* {
- * kind: String (Optional)
+ * kind: String(cobra) (Optional)
* length: int (Required)
* }
* }
diff --git a/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/Cobra.java b/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/Cobra.java
index f5d3abef40..186b5ff37f 100644
--- a/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/Cobra.java
+++ b/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/Cobra.java
@@ -24,7 +24,7 @@ public final class Cobra extends Snake {
@Generated
public Cobra(int length) {
super(length);
- setKind("cobra");
+ setKind(SnakeKind.COBRA);
}
@Generated
@@ -32,7 +32,7 @@ public Cobra(int length) {
public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
jsonWriter.writeStartObject();
jsonWriter.writeIntField("length", getLength());
- jsonWriter.writeStringField("kind", getKind());
+ jsonWriter.writeStringField("kind", getKind() == null ? null : getKind().toString());
return jsonWriter.writeEndObject();
}
@@ -49,7 +49,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
public static Cobra fromJson(JsonReader jsonReader) throws IOException {
return jsonReader.readObject(reader -> {
int length = 0;
- String kind = "cobra";
+ SnakeKind kind = SnakeKind.COBRA;
while (reader.nextToken() != JsonToken.END_OBJECT) {
String fieldName = reader.getFieldName();
reader.nextToken();
@@ -57,7 +57,7 @@ public static Cobra fromJson(JsonReader jsonReader) throws IOException {
if ("length".equals(fieldName)) {
length = reader.getInt();
} else if ("kind".equals(fieldName)) {
- kind = reader.getString();
+ kind = SnakeKind.fromString(reader.getString());
} else {
reader.skipChildren();
}
diff --git a/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/Dog.java b/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/Dog.java
index cbd1971cf5..bd4523fbf4 100644
--- a/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/Dog.java
+++ b/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/Dog.java
@@ -21,7 +21,7 @@ public class Dog implements JsonSerializable {
* discriminator property
*/
@Generated
- private String kind;
+ private DogKind kind;
/*
* Weight of the dog
@@ -36,7 +36,7 @@ public class Dog implements JsonSerializable {
*/
@Generated
public Dog(int weight) {
- this.kind = "Dog";
+ this.kind = DogKind.fromString("Dog");
this.weight = weight;
}
@@ -46,7 +46,7 @@ public Dog(int weight) {
* @return the kind value.
*/
@Generated
- public String getKind() {
+ public DogKind getKind() {
return this.kind;
}
@@ -57,7 +57,7 @@ public String getKind() {
* @return the Dog object itself.
*/
@Generated
- Dog setKind(String kind) {
+ Dog setKind(DogKind kind) {
this.kind = kind;
return this;
}
@@ -77,7 +77,7 @@ public int getWeight() {
public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
jsonWriter.writeStartObject();
jsonWriter.writeIntField("weight", this.weight);
- jsonWriter.writeStringField("kind", this.kind);
+ jsonWriter.writeStringField("kind", this.kind == null ? null : this.kind.toString());
return jsonWriter.writeEndObject();
}
@@ -120,7 +120,7 @@ public static Dog fromJson(JsonReader jsonReader) throws IOException {
static Dog fromJsonKnownDiscriminator(JsonReader jsonReader) throws IOException {
return jsonReader.readObject(reader -> {
int weight = 0;
- String kind = null;
+ DogKind kind = null;
while (reader.nextToken() != JsonToken.END_OBJECT) {
String fieldName = reader.getFieldName();
reader.nextToken();
@@ -128,7 +128,7 @@ static Dog fromJsonKnownDiscriminator(JsonReader jsonReader) throws IOException
if ("weight".equals(fieldName)) {
weight = reader.getInt();
} else if ("kind".equals(fieldName)) {
- kind = reader.getString();
+ kind = DogKind.fromString(reader.getString());
} else {
reader.skipChildren();
}
diff --git a/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/DogKind.java b/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/DogKind.java
new file mode 100644
index 0000000000..594fcf9f94
--- /dev/null
+++ b/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/DogKind.java
@@ -0,0 +1,51 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+
+package com.type.model.inheritance.enumdiscriminator.models;
+
+import com.azure.core.annotation.Generated;
+import com.azure.core.util.ExpandableStringEnum;
+import java.util.Collection;
+
+/**
+ * extensible enum type for discriminator.
+ */
+public final class DogKind extends ExpandableStringEnum {
+ /**
+ * Species golden.
+ */
+ @Generated
+ public static final DogKind GOLDEN = fromString("golden");
+
+ /**
+ * Creates a new instance of DogKind value.
+ *
+ * @deprecated Use the {@link #fromString(String)} factory method.
+ */
+ @Generated
+ @Deprecated
+ public DogKind() {
+ }
+
+ /**
+ * Creates or finds a DogKind from its string representation.
+ *
+ * @param name a name to look for.
+ * @return the corresponding DogKind.
+ */
+ @Generated
+ public static DogKind fromString(String name) {
+ return fromString(name, DogKind.class);
+ }
+
+ /**
+ * Gets known DogKind values.
+ *
+ * @return known DogKind values.
+ */
+ @Generated
+ public static Collection values() {
+ return values(DogKind.class);
+ }
+}
diff --git a/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/Golden.java b/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/Golden.java
index 349c538bfa..fe54ed689e 100644
--- a/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/Golden.java
+++ b/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/Golden.java
@@ -24,7 +24,7 @@ public final class Golden extends Dog {
@Generated
public Golden(int weight) {
super(weight);
- setKind("golden");
+ setKind(DogKind.GOLDEN);
}
@Generated
@@ -32,7 +32,7 @@ public Golden(int weight) {
public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
jsonWriter.writeStartObject();
jsonWriter.writeIntField("weight", getWeight());
- jsonWriter.writeStringField("kind", getKind());
+ jsonWriter.writeStringField("kind", getKind() == null ? null : getKind().toString());
return jsonWriter.writeEndObject();
}
@@ -49,7 +49,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
public static Golden fromJson(JsonReader jsonReader) throws IOException {
return jsonReader.readObject(reader -> {
int weight = 0;
- String kind = "golden";
+ DogKind kind = DogKind.GOLDEN;
while (reader.nextToken() != JsonToken.END_OBJECT) {
String fieldName = reader.getFieldName();
reader.nextToken();
@@ -57,7 +57,7 @@ public static Golden fromJson(JsonReader jsonReader) throws IOException {
if ("weight".equals(fieldName)) {
weight = reader.getInt();
} else if ("kind".equals(fieldName)) {
- kind = reader.getString();
+ kind = DogKind.fromString(reader.getString());
} else {
reader.skipChildren();
}
diff --git a/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/Snake.java b/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/Snake.java
index 5356770a98..2638bec845 100644
--- a/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/Snake.java
+++ b/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/Snake.java
@@ -21,7 +21,7 @@ public class Snake implements JsonSerializable {
* discriminator property
*/
@Generated
- private String kind;
+ private SnakeKind kind;
/*
* Length of the snake
@@ -36,7 +36,7 @@ public class Snake implements JsonSerializable {
*/
@Generated
public Snake(int length) {
- this.kind = "Snake";
+ this.kind = SnakeKind.fromString("Snake");
this.length = length;
}
@@ -46,7 +46,7 @@ public Snake(int length) {
* @return the kind value.
*/
@Generated
- public String getKind() {
+ public SnakeKind getKind() {
return this.kind;
}
@@ -57,7 +57,7 @@ public String getKind() {
* @return the Snake object itself.
*/
@Generated
- Snake setKind(String kind) {
+ Snake setKind(SnakeKind kind) {
this.kind = kind;
return this;
}
@@ -77,7 +77,7 @@ public int getLength() {
public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
jsonWriter.writeStartObject();
jsonWriter.writeIntField("length", this.length);
- jsonWriter.writeStringField("kind", this.kind);
+ jsonWriter.writeStringField("kind", this.kind == null ? null : this.kind.toString());
return jsonWriter.writeEndObject();
}
@@ -120,7 +120,7 @@ public static Snake fromJson(JsonReader jsonReader) throws IOException {
static Snake fromJsonKnownDiscriminator(JsonReader jsonReader) throws IOException {
return jsonReader.readObject(reader -> {
int length = 0;
- String kind = null;
+ SnakeKind kind = null;
while (reader.nextToken() != JsonToken.END_OBJECT) {
String fieldName = reader.getFieldName();
reader.nextToken();
@@ -128,7 +128,7 @@ static Snake fromJsonKnownDiscriminator(JsonReader jsonReader) throws IOExceptio
if ("length".equals(fieldName)) {
length = reader.getInt();
} else if ("kind".equals(fieldName)) {
- kind = reader.getString();
+ kind = SnakeKind.fromString(reader.getString());
} else {
reader.skipChildren();
}
diff --git a/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/SnakeKind.java b/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/SnakeKind.java
new file mode 100644
index 0000000000..8023a74e8b
--- /dev/null
+++ b/typespec-tests/src/main/java/com/type/model/inheritance/enumdiscriminator/models/SnakeKind.java
@@ -0,0 +1,51 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+// Code generated by Microsoft (R) TypeSpec Code Generator.
+
+package com.type.model.inheritance.enumdiscriminator.models;
+
+/**
+ * fixed enum type for discriminator.
+ */
+public enum SnakeKind {
+ /**
+ * Species cobra.
+ */
+ COBRA("cobra");
+
+ /**
+ * The actual serialized value for a SnakeKind instance.
+ */
+ private final String value;
+
+ SnakeKind(String value) {
+ this.value = value;
+ }
+
+ /**
+ * Parses a serialized value to a SnakeKind instance.
+ *
+ * @param value the serialized value to parse.
+ * @return the parsed SnakeKind object, or null if unable to parse.
+ */
+ public static SnakeKind fromString(String value) {
+ if (value == null) {
+ return null;
+ }
+ SnakeKind[] items = SnakeKind.values();
+ for (SnakeKind item : items) {
+ if (item.toString().equalsIgnoreCase(value)) {
+ return item;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String toString() {
+ return this.value;
+ }
+}