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; + } +}