From 22398365668da9dd8e8fbf13dd294f8c882050e7 Mon Sep 17 00:00:00 2001 From: Steve Rice Date: Fri, 24 Jan 2025 16:46:25 -0800 Subject: [PATCH 1/2] Make `createStateSymbol` a common utility function for `@typespec/compiler` This commit addresses a suggestion from c788082e18a833aa764e5108d110090bdced8988 to refactor `createStateSymbol` into a shared utility function. This is not meant for use outside of `@typespec/compiler`, but rather an internal utility. --- packages/compiler/src/core/deprecation.ts | 5 +---- packages/compiler/src/core/intrinsic-type-state.ts | 5 +---- packages/compiler/src/core/visibility/core.ts | 5 +---- packages/compiler/src/lib/decorators.ts | 5 +---- packages/compiler/src/lib/encoded-names.ts | 5 +---- packages/compiler/src/lib/key.ts | 5 +---- packages/compiler/src/lib/paging.ts | 5 +---- packages/compiler/src/lib/utils.ts | 8 ++++++++ packages/compiler/src/lib/visibility.ts | 6 +----- 9 files changed, 16 insertions(+), 33 deletions(-) diff --git a/packages/compiler/src/core/deprecation.ts b/packages/compiler/src/core/deprecation.ts index 8407342c9c..e8d42323cd 100644 --- a/packages/compiler/src/core/deprecation.ts +++ b/packages/compiler/src/core/deprecation.ts @@ -1,10 +1,7 @@ +import { createStateSymbol } from "../lib/utils.js"; import type { Program } from "./program.js"; import { BaseNode, Node, SyntaxKind, Type } from "./types.js"; -function createStateSymbol(name: string) { - return Symbol.for(`TypeSpec.${name}`); -} - const deprecatedKey = createStateSymbol("deprecated"); /** diff --git a/packages/compiler/src/core/intrinsic-type-state.ts b/packages/compiler/src/core/intrinsic-type-state.ts index 154dde0aa9..34fd947dc4 100644 --- a/packages/compiler/src/core/intrinsic-type-state.ts +++ b/packages/compiler/src/core/intrinsic-type-state.ts @@ -1,14 +1,11 @@ // Contains all intrinsic data setter or getter // Anything that the TypeSpec check might should be here. +import { createStateSymbol } from "../lib/utils.js"; import type { Model, Type, Union } from "./index.js"; import type { Numeric } from "./numeric.js"; import type { Program } from "./program.js"; -function createStateSymbol(name: string) { - return Symbol.for(`TypeSpec.${name}`); -} - const stateKeys = { minValues: createStateSymbol("minValues"), maxValues: createStateSymbol("maxValues"), diff --git a/packages/compiler/src/core/visibility/core.ts b/packages/compiler/src/core/visibility/core.ts index 6a301a412c..4da55b04ac 100644 --- a/packages/compiler/src/core/visibility/core.ts +++ b/packages/compiler/src/core/visibility/core.ts @@ -29,6 +29,7 @@ import { } from "./lifecycle.js"; import type { VisibilityFilter as GeneratedVisibilityFilter } from "../../../generated-defs/TypeSpec.js"; +import { createStateSymbol } from "../../lib/utils.js"; import { useStateMap, useStateSet } from "../../utils/index.js"; export { GeneratedVisibilityFilter }; @@ -38,10 +39,6 @@ export { GeneratedVisibilityFilter }; */ type VisibilityModifiers = Map>; -function createStateSymbol(name: string) { - return Symbol.for(`TypeSpec.${name}`); -} - /** * The global visibility store. * diff --git a/packages/compiler/src/lib/decorators.ts b/packages/compiler/src/lib/decorators.ts index b886ca14dc..d65f8f2ae6 100644 --- a/packages/compiler/src/lib/decorators.ts +++ b/packages/compiler/src/lib/decorators.ts @@ -100,6 +100,7 @@ import { } from "../core/types.js"; import { useStateMap, useStateSet } from "../utils/index.js"; import { setKey } from "./key.js"; +import { createStateSymbol } from "./utils.js"; export { $encodedName, resolveEncodedName } from "./encoded-names.js"; export { serializeValueAsJson } from "./examples.js"; @@ -121,10 +122,6 @@ function replaceTemplatedStringFromProperties(formatString: string, sourceObject }); } -function createStateSymbol(name: string) { - return Symbol.for(`TypeSpec.${name}`); -} - const [getSummary, setSummary] = useStateMap(createStateSymbol("summary")); /** * @summary attaches a documentation string. It is typically used to give a short, single-line diff --git a/packages/compiler/src/lib/encoded-names.ts b/packages/compiler/src/lib/encoded-names.ts index 612e68bede..3ccb45ecdd 100644 --- a/packages/compiler/src/lib/encoded-names.ts +++ b/packages/compiler/src/lib/encoded-names.ts @@ -3,10 +3,7 @@ import { parseMimeType } from "../core/mime-type.js"; import type { Program } from "../core/program.js"; import type { DecoratorContext, Enum, Model, Type, Union } from "../core/types.js"; import { DuplicateTracker, useStateMap } from "../utils/index.js"; - -function createStateSymbol(name: string) { - return Symbol.for(`TypeSpec.${name}`); -} +import { createStateSymbol } from "./utils.js"; const [getEncodedNamesMap, setEncodedNamesMap, getEncodedNamesStateMap] = useStateMap< Type, diff --git a/packages/compiler/src/lib/key.ts b/packages/compiler/src/lib/key.ts index eb7f8a76d7..42db15292d 100644 --- a/packages/compiler/src/lib/key.ts +++ b/packages/compiler/src/lib/key.ts @@ -1,10 +1,7 @@ import { Program } from "../core/index.js"; import { ModelProperty, Type } from "../core/types.js"; import { useStateMap } from "../utils/index.js"; - -function createStateSymbol(name: string) { - return Symbol.for(`TypeSpec.${name}`); -} +import { createStateSymbol } from "./utils.js"; const [getKey, setKey] = useStateMap(createStateSymbol("key")); diff --git a/packages/compiler/src/lib/paging.ts b/packages/compiler/src/lib/paging.ts index e4ca7a079b..996a11dbc9 100644 --- a/packages/compiler/src/lib/paging.ts +++ b/packages/compiler/src/lib/paging.ts @@ -26,6 +26,7 @@ import type { Operation, Type, } from "../core/types.js"; +import { createStateSymbol } from "../lib/utils.js"; import { DuplicateTracker, useStateSet } from "../utils/index.js"; import { isNumericType, isStringType } from "./decorators.js"; @@ -341,10 +342,6 @@ function validatePagingOperation(program: Program, op: Operation) { program.reportDiagnostics(diagnostics); } -function createStateSymbol(name: string) { - return Symbol.for(`TypeSpec.${name}`); -} - function createMarkerDecorator( key: string, validate?: (...args: Parameters) => boolean, diff --git a/packages/compiler/src/lib/utils.ts b/packages/compiler/src/lib/utils.ts index 46625f7b76..09a70ea5b5 100644 --- a/packages/compiler/src/lib/utils.ts +++ b/packages/compiler/src/lib/utils.ts @@ -17,3 +17,11 @@ export function filterModelPropertiesInPlace( } } } + +/** + * Creates a unique symbol for storing state on objects + * @param name The name/description of the state + */ +export function createStateSymbol(name: string): symbol { + return Symbol.for(`TypeSpec.${name}`); +} diff --git a/packages/compiler/src/lib/visibility.ts b/packages/compiler/src/lib/visibility.ts index 7cb7478e9b..846aa07ba5 100644 --- a/packages/compiler/src/lib/visibility.ts +++ b/packages/compiler/src/lib/visibility.ts @@ -52,14 +52,10 @@ import { import { isMutableType, mutateSubgraph, Mutator, MutatorFlow } from "../experimental/mutators.js"; import { useStateMap } from "../utils/index.js"; import { isKey } from "./key.js"; -import { filterModelPropertiesInPlace } from "./utils.js"; +import { createStateSymbol, filterModelPropertiesInPlace } from "./utils.js"; // #region Legacy Visibility Utilities -function createStateSymbol(name: string) { - return Symbol.for(`TypeSpec.${name}`); -} - /** * Takes a list of visibilities that possibly include both legacy visibility * strings and visibility class members, and returns two lists containing only From c97fd350035ff8eb30147e0b1b308bc0414423a8 Mon Sep 17 00:00:00 2001 From: Steve Rice Date: Sat, 25 Jan 2025 10:47:03 -0800 Subject: [PATCH 2/2] Add changelog entry --- .../steverice-createStateSymbol-util-2025-0-25-10-46-13.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .chronus/changes/steverice-createStateSymbol-util-2025-0-25-10-46-13.md diff --git a/.chronus/changes/steverice-createStateSymbol-util-2025-0-25-10-46-13.md b/.chronus/changes/steverice-createStateSymbol-util-2025-0-25-10-46-13.md new file mode 100644 index 0000000000..44843e83f4 --- /dev/null +++ b/.chronus/changes/steverice-createStateSymbol-util-2025-0-25-10-46-13.md @@ -0,0 +1,7 @@ +--- +changeKind: internal +packages: + - "@typespec/compiler" +--- + +Make `createStateSymbol` a common utility function for `@typespec/compiler` \ No newline at end of file