diff --git a/.changeset/calm-seas-clean.md b/.changeset/calm-seas-clean.md new file mode 100644 index 00000000..66239868 --- /dev/null +++ b/.changeset/calm-seas-clean.md @@ -0,0 +1,8 @@ +--- +"@ui5-language-assistant/vscode-ui5-language-assistant-bas-ext": patch +"vscode-ui5-language-assistant": patch +"@ui5-language-assistant/language-server": patch +"@ui5-language-assistant/binding": patch +--- + +Relax diagnostics for aggregation which have alternative types diff --git a/packages/binding/src/definition/definition.ts b/packages/binding/src/definition/definition.ts index 397ade7d..45b0dd60 100644 --- a/packages/binding/src/definition/definition.ts +++ b/packages/binding/src/definition/definition.ts @@ -22,6 +22,10 @@ import { getDocumentation } from "../utils"; import { getFallBackElements } from "./fall-back-definition"; import { getSorterPossibleElement } from "./sorter"; import { getFiltersPossibleElement } from "./filter"; +import type { + UI5Aggregation, + UI5TypedefProp, +} from "@ui5-language-assistant/semantic-model-types"; const notAllowedElements: Map = new Map([ [BindingInfoName.path, [BindingInfoName.parts, BindingInfoName.value]], @@ -124,13 +128,13 @@ const sorterMap = new Map([ ]); const getPossibleElement = (param: { context: BindContext; - aggregation?: boolean; + ui5Aggregation?: UI5Aggregation; forHover?: boolean; type: UI5Class; }): BindingInfoElement[] => { const result: BindingInfoElement[] = []; /* istanbul ignore next */ - const { aggregation = false, forHover = false, type, context } = param; + const { ui5Aggregation, forHover = false, type, context } = param; if (type.name === ClassName.Sorter) { const parameters = type.ctor && type.ctor.parameters; if (!parameters) { @@ -150,7 +154,7 @@ const getPossibleElement = (param: { type: constParam.type, name, collection: false, - aggregation, + ui5Aggregation, forHover, reference, }), @@ -190,7 +194,7 @@ const getPossibleElement = (param: { type: paramType, name: param.name, collection: false, - aggregation, + ui5Aggregation, forHover, reference, }), @@ -242,20 +246,21 @@ const buildType = (param: { type: UI5Type; name: string; collection?: boolean; - aggregation?: boolean; + ui5Aggregation?: UI5Aggregation; forHover?: boolean; reference?: string; }): PropertyType[] => { /* istanbul ignore next */ const { collection = false, - aggregation = false, + ui5Aggregation, forHover = false, context, type, name, reference, } = param; + const aggregation = !!ui5Aggregation; const propertyType: PropertyType[] = []; switch (type.kind) { case "UI5Any": { @@ -309,7 +314,7 @@ const buildType = (param: { notAllowedElements: getFromMap(notAllowedElements, name, aggregation), possibleElements: reference ? [] - : getPossibleElement({ context, aggregation, forHover, type }), + : getPossibleElement({ context, ui5Aggregation, forHover, type }), possibleValue: { fixed: false, values: getPossibleValuesForClass(context, type), @@ -338,7 +343,7 @@ const buildType = (param: { type: unionType.type, name, collection: true, - aggregation, + ui5Aggregation, forHover, reference, }) @@ -350,7 +355,7 @@ const buildType = (param: { type: unionType, name, collection, - aggregation, + ui5Aggregation, forHover, reference, }) @@ -368,7 +373,7 @@ const buildType = (param: { type: type.type, name, collection: true, - aggregation, + ui5Aggregation, forHover, reference, }) @@ -378,53 +383,57 @@ const buildType = (param: { return propertyType; }; -export const getBindingElements = ( - context: BindContext, - /* istanbul ignore next */ - aggregation = false, - /* istanbul ignore next */ - forHover = false -): BindingInfoElement[] => { - const elements: BindingInfoElement[] = []; - const propBinding = aggregation - ? context.ui5Model.typedefs[AGGREGATION_BINDING_INFO] - : context.ui5Model.typedefs[PROPERTY_BINDING_INFO]; +const getAltTypesPrime = (aggregation?: UI5Aggregation) => + aggregation?.altTypes?.find((i) => i.kind === "PrimitiveType"); - if (!propBinding) { - return getFallBackElements(aggregation); - } - /* istanbul ignore next */ - const properties = propBinding.properties ?? []; +const removeDuplicate = (builtType: PropertyType[]): PropertyType[] => { + const result = builtType.reduce( + (previous: PropertyType[], current: PropertyType) => { + const index = previous.findIndex((i) => i.kind === current.kind); + if (index === -1) { + return [...previous, current]; + } + // there is duplicate + /* istanbul ignore next */ + if (current.possibleValue?.values.length !== 0) { + // has possible value, remove previous - keep current + return [...previous.slice(index), current]; + } + /* istanbul ignore next */ + if (previous[index].possibleValue?.values.length !== 0) { + // has possible value - keep it + return previous; + } + return [...previous, current]; + }, + [] + ); + return result; +}; + +const processUI5TypedefProperties = (param: { + properties: UI5TypedefProp[]; + context: BindContext; + aggregation?: UI5Aggregation; + forHover?: boolean; +}) => { + const { properties, forHover = false, aggregation, context } = param; + const elements: BindingInfoElement[] = []; for (const property of properties) { const { name, type } = property; if (!type) { /* istanbul ignore next */ continue; } - const builtType = buildType({ + let builtType = buildType({ context, type, name, collection: false, - aggregation, + ui5Aggregation: aggregation, forHover, - }).reduce((previous: PropertyType[], current: PropertyType) => { - const index = previous.findIndex((i) => i.kind === current.kind); - if (index !== -1) { - // there is duplicate - /* istanbul ignore next */ - if (current.possibleValue?.values.length !== 0) { - // has possible value, remove previous - keep current - return [...previous.slice(index), current]; - } - /* istanbul ignore next */ - if (previous[index].possibleValue?.values.length !== 0) { - // has possible value - keep it - return previous; - } - } - return [...previous, current]; - }, []); + }); + builtType = removeDuplicate(builtType); const FQN = aggregation ? AGGREGATION_BINDING_INFO : PROPERTY_BINDING_INFO; const data: BindingInfoElement = { name: name, @@ -443,3 +452,40 @@ export const getBindingElements = ( } return elements; }; +export const getBindingElements = ( + context: BindContext, + /* istanbul ignore next */ + aggregation: UI5Aggregation | undefined = undefined, + /* istanbul ignore next */ + forHover = false +): BindingInfoElement[] => { + const elements: BindingInfoElement[] = []; + const propBinding = aggregation + ? context.ui5Model.typedefs[AGGREGATION_BINDING_INFO] + : context.ui5Model.typedefs[PROPERTY_BINDING_INFO]; + + if (!propBinding) { + return getFallBackElements(!!aggregation); + } + elements.push( + ...processUI5TypedefProperties({ + context, + forHover, + aggregation, + properties: propBinding.properties, + }) + ); + const altTypes = getAltTypesPrime(aggregation); + if (altTypes) { + // if `altTypes`, add `PROPERTY_BINDING_INFO` properties too + elements.push( + ...processUI5TypedefProperties({ + properties: context.ui5Model.typedefs[PROPERTY_BINDING_INFO].properties, + context, + forHover, + }) + ); + } + + return elements; +}; diff --git a/packages/binding/src/services/completion/providers/binding.ts b/packages/binding/src/services/completion/providers/binding.ts index 05a4aad5..625d26ab 100644 --- a/packages/binding/src/services/completion/providers/binding.ts +++ b/packages/binding/src/services/completion/providers/binding.ts @@ -22,13 +22,14 @@ import { createKeyProperties } from "./create-key-properties"; import { createValue } from "./create-value"; import { createKeyValue } from "./create-key-value"; import { getBindingElements } from "./../../../definition/definition"; +import type { UI5Aggregation } from "@ui5-language-assistant/semantic-model-types"; export const getCompletionItems = ( context: BindContext, binding: BindingTypes.StructureValue, spaces: BindingTypes.WhiteSpaces[], /* istanbul ignore next */ - aggregation = false, + aggregation: UI5Aggregation | undefined = undefined, /* istanbul ignore next */ bindingElements = getBindingElements(context, aggregation) ): CompletionItem[] => { @@ -80,7 +81,7 @@ export function bindingSuggestions({ if (!ui5Property && !ui5Aggregation) { return completionItems; } - const propBinding = getBindingElements(context, !!ui5Aggregation, false); + const propBinding = getBindingElements(context, ui5Aggregation, false); const properties = propBinding.map((i) => i.name); const value = attribute.syntax.value; const startChar = value && value.image.charAt(0); @@ -123,7 +124,7 @@ export function bindingSuggestions({ context, binding, ast.spaces, - !!ui5Aggregation, + ui5Aggregation, propBinding ) ); diff --git a/packages/binding/src/services/completion/providers/create-collection-value.ts b/packages/binding/src/services/completion/providers/create-collection-value.ts index 46b4ab6e..5a275a30 100644 --- a/packages/binding/src/services/completion/providers/create-collection-value.ts +++ b/packages/binding/src/services/completion/providers/create-collection-value.ts @@ -12,7 +12,7 @@ import { positionInside, isPrimitiveValue, } from "@ui5-language-assistant/binding-parser"; - +import type { UI5Aggregation } from "@ui5-language-assistant/semantic-model-types"; import { isParts, typesToValue } from "../../../utils"; import { BindContext, @@ -48,8 +48,7 @@ export const createCollectionValue = ( spaces: BindingTypes.WhiteSpaces[], valueContext: ValueContext, bindingElements: BindingInfoElement[], - /* istanbul ignore next */ - aggregation = false + aggregation?: UI5Aggregation ): CompletionItem[] => { const { element } = valueContext; if (!isCollectionValue(element.value)) { diff --git a/packages/binding/src/services/completion/providers/create-structure-value.ts b/packages/binding/src/services/completion/providers/create-structure-value.ts index 7f5c3279..c9d4af3c 100644 --- a/packages/binding/src/services/completion/providers/create-structure-value.ts +++ b/packages/binding/src/services/completion/providers/create-structure-value.ts @@ -8,14 +8,14 @@ import { import { BindContext, BindingInfoElement, ValueContext } from "../../../types"; import { getBindingElements } from "./../../../api"; import { getCompletionItems } from "./binding"; +import type { UI5Aggregation } from "@ui5-language-assistant/semantic-model-types"; export const createStructureValue = ( context: BindContext, spaces: BindingTypes.WhiteSpaces[], valueContext: ValueContext, bindingElements: BindingInfoElement[], - /* istanbul ignore next */ - aggregation = false + aggregation?: UI5Aggregation ): CompletionItem[] => { const { element } = valueContext; /* istanbul ignore next */ diff --git a/packages/binding/src/services/completion/providers/create-value.ts b/packages/binding/src/services/completion/providers/create-value.ts index 6e85ac3c..0cd1112e 100644 --- a/packages/binding/src/services/completion/providers/create-value.ts +++ b/packages/binding/src/services/completion/providers/create-value.ts @@ -10,14 +10,14 @@ import { BindContext, BindingInfoElement, ValueContext } from "../../../types"; import { createDefaultValue } from "./create-default-value"; import { createCollectionValue } from "./create-collection-value"; import { createStructureValue } from "./create-structure-value"; +import type { UI5Aggregation } from "@ui5-language-assistant/semantic-model-types"; export const createValue = ( context: BindContext, spaces: BindingTypes.WhiteSpaces[], valueContext: ValueContext, bindingElements: BindingInfoElement[], - /* istanbul ignore next */ - aggregation = false + aggregation?: UI5Aggregation ): CompletionItem[] => { const completionItems: CompletionItem[] = []; const { element } = valueContext; diff --git a/packages/binding/src/services/diagnostics/validators/binding-validator.ts b/packages/binding/src/services/diagnostics/validators/binding-validator.ts index af627dad..4e2bb9ab 100644 --- a/packages/binding/src/services/diagnostics/validators/binding-validator.ts +++ b/packages/binding/src/services/diagnostics/validators/binding-validator.ts @@ -36,11 +36,7 @@ export function validateBinding( if (!ui5Property && !ui5Aggregation) { return issues; } - const bindingElements = getBindingElements( - context, - !!ui5Aggregation, - false - ); + const bindingElements = getBindingElements(context, ui5Aggregation, false); const properties = bindingElements.map((i) => i.name); const value = attribute.syntax.value; /* istanbul ignore next */ @@ -74,7 +70,7 @@ export function validateBinding( context, binding, errors, - !!ui5Aggregation, + ui5Aggregation, bindingElements ) ); diff --git a/packages/binding/src/services/diagnostics/validators/check-collection-value.ts b/packages/binding/src/services/diagnostics/validators/check-collection-value.ts index 26dcd385..d1048c75 100644 --- a/packages/binding/src/services/diagnostics/validators/check-collection-value.ts +++ b/packages/binding/src/services/diagnostics/validators/check-collection-value.ts @@ -18,6 +18,7 @@ import { checkComma } from "./check-comma"; import { checkBrackets } from "./check-brackets"; import { t } from "../../../i18n"; import { createMissMatchValueIssue } from "./common"; +import type { UI5Aggregation } from "@ui5-language-assistant/semantic-model-types"; /** * Check collection value @@ -33,8 +34,7 @@ export const checkCollectionValue = ( lexer: BindingTypes.LexerError[]; }, bindingElements: BindingInfoElement[], - /* istanbul ignore next */ - aggregation = false + aggregation?: UI5Aggregation ): BindingIssue[] => { const issues: BindingIssue[] = []; const value = element.value; diff --git a/packages/binding/src/services/diagnostics/validators/check-key.ts b/packages/binding/src/services/diagnostics/validators/check-key.ts index d1ad79ae..4650a107 100644 --- a/packages/binding/src/services/diagnostics/validators/check-key.ts +++ b/packages/binding/src/services/diagnostics/validators/check-key.ts @@ -6,6 +6,7 @@ import { import { BindingParserTypes as BindingTypes } from "@ui5-language-assistant/binding-parser"; import { findRange } from "../../../utils"; import { t } from "../../../i18n"; +import type { UI5Aggregation } from "@ui5-language-assistant/semantic-model-types"; /** * Check if key is a one of supported property binding info @@ -13,8 +14,7 @@ import { t } from "../../../i18n"; export const checkKey = ( element: BindingTypes.StructureElement, bindingElements: BindingInfoElement[], - /* istanbul ignore next */ - aggregation = false + aggregation?: UI5Aggregation ): BindingIssue[] => { const issues: BindingIssue[] = []; if (!element.key) { diff --git a/packages/binding/src/services/diagnostics/validators/check-structure-value.ts b/packages/binding/src/services/diagnostics/validators/check-structure-value.ts index bfd8bcc4..dfa08b11 100644 --- a/packages/binding/src/services/diagnostics/validators/check-structure-value.ts +++ b/packages/binding/src/services/diagnostics/validators/check-structure-value.ts @@ -7,6 +7,7 @@ import { checkBinding } from "./issue-collector"; import { getBindingElements } from "../../../definition/definition"; import { valueTypeMap } from "../../../utils"; import { createMissMatchValueIssue } from "./common"; +import type { UI5Aggregation } from "@ui5-language-assistant/semantic-model-types"; /** * Check structure value @@ -22,8 +23,7 @@ export const checkStructureValue = ( lexer: BindingTypes.LexerError[]; }, bindingElements: BindingInfoElement[], - /* istanbul ignore next */ - aggregation = false + aggregation?: UI5Aggregation ): BindingIssue[] => { const issues: BindingIssue[] = []; const value = element.value; diff --git a/packages/binding/src/services/diagnostics/validators/issue-collector.ts b/packages/binding/src/services/diagnostics/validators/issue-collector.ts index f22694df..af4bc2c8 100644 --- a/packages/binding/src/services/diagnostics/validators/issue-collector.ts +++ b/packages/binding/src/services/diagnostics/validators/issue-collector.ts @@ -17,6 +17,7 @@ import { getBindingElements } from "../../../api"; import { isAnyType } from "../../../utils"; import { checkSkeleton } from "./check-skeleton"; import { checkRequiredElement } from "./check-required"; +import type { UI5Aggregation } from "@ui5-language-assistant/semantic-model-types"; /** * Check binding @@ -28,8 +29,7 @@ export const checkBinding = ( parse: BindingTypes.ParseError[]; lexer: BindingTypes.LexerError[]; }, - /* istanbul ignore next */ - aggregation = false, + aggregation: UI5Aggregation | undefined = undefined, /* istanbul ignore next */ bindingElements = getBindingElements(context, aggregation), /* istanbul ignore next */ diff --git a/packages/binding/src/services/hover/index.ts b/packages/binding/src/services/hover/index.ts index 4ded0afb..c8dbd1ea 100644 --- a/packages/binding/src/services/hover/index.ts +++ b/packages/binding/src/services/hover/index.ts @@ -18,12 +18,13 @@ import { import { Position } from "vscode-languageserver-types"; import { BindContext, BindingInfoElement } from "../../types"; import { getBindingElements } from "../../definition/definition"; +import type { UI5Aggregation } from "@ui5-language-assistant/semantic-model-types"; const getHoverFromBinding = ( context: BindContext, bindingElements: BindingInfoElement[], binding: BindingParserTypes.StructureValue, - aggregation: boolean + aggregation?: UI5Aggregation ): Hover | undefined => { let hover: Hover | undefined; /* istanbul ignore next */ @@ -150,7 +151,7 @@ export const getHover = ( if (text.trim().length === 0) { return; } - const propBinding = getBindingElements(context, !!ui5Aggregation, true); + const propBinding = getBindingElements(context, ui5Aggregation, true); const properties = propBinding.map((i) => i.name); const extractedText = extractBindingSyntax(text); for (const bindingSyntax of extractedText) { @@ -178,12 +179,7 @@ export const getHover = ( if (!isBindingAllowed(text, binding, errors, properties)) { continue; } - return getHoverFromBinding( - context, - propBinding, - binding, - !!ui5Aggregation - ); + return getHoverFromBinding(context, propBinding, binding, ui5Aggregation); } return; } catch (error) { diff --git a/packages/binding/test/unit/definition/definition.test.ts b/packages/binding/test/unit/definition/definition.test.ts index ec1fc3d9..3920602a 100644 --- a/packages/binding/test/unit/definition/definition.test.ts +++ b/packages/binding/test/unit/definition/definition.test.ts @@ -8,7 +8,10 @@ import { import { getContext } from "@ui5-language-assistant/context"; import { BindContext } from "../../../src/types"; import { getBindingElements } from "../../../src/definition/definition"; -import { UI5Typedef } from "@ui5-language-assistant/semantic-model-types"; +import type { + UI5Aggregation, + UI5Typedef, +} from "@ui5-language-assistant/semantic-model-types"; import { initI18n } from "../../../src/i18n"; describe("definition", () => { @@ -44,24 +47,21 @@ describe("definition", () => { expect(result).toMatchSnapshot(); }); it("get binding elements - aggregation", () => { - const result = getBindingElements(context, true); + const result = getBindingElements(context, {} as UI5Aggregation); expect(result).toMatchSnapshot(); }); it("check fallback", () => { - const result = getBindingElements( - { - ...context, - ui5Model: { - ...context.ui5Model, - typedefs: { - ...context.ui5Model.typedefs, - "sap.ui.base.ManagedObject.PropertyBindingInfo": - undefined as unknown as UI5Typedef, - }, + const result = getBindingElements({ + ...context, + ui5Model: { + ...context.ui5Model, + typedefs: { + ...context.ui5Model.typedefs, + "sap.ui.base.ManagedObject.PropertyBindingInfo": + undefined as unknown as UI5Typedef, }, }, - false - ); + }); expect(result).toMatchSnapshot(); }); it("check fallback - aggregation", () => { @@ -77,7 +77,7 @@ describe("definition", () => { }, }, }, - true + {} as UI5Aggregation ); expect(result).toMatchSnapshot(); }); diff --git a/packages/binding/test/unit/helper.ts b/packages/binding/test/unit/helper.ts index f3c1c351..8d44762b 100644 --- a/packages/binding/test/unit/helper.ts +++ b/packages/binding/test/unit/helper.ts @@ -30,6 +30,22 @@ const createRange = (range: Range | undefined): string => { return "0:0-0:0"; }; +export const removeUI5PatchVersion = ( + completionItems: CompletionItem[] +): void => { + for (const item of completionItems) { + if (item.documentation) { + if (typeof item.documentation === "string") { + const value = item.documentation.replace(/\.(\d+)\//, ""); + item.documentation = value; + } else if (item.documentation.kind === "markdown") { + const value = item.documentation.value.replace(/\.(\d+)\//, ""); + item.documentation.value = value; + } + } + } +}; + export const completionItemToSnapshot = ( item: CompletionItem, documentation = false @@ -99,7 +115,7 @@ export const getViewCompletionProvider = ); const context = (await getContext(documentPath)) as Context; - return await getCompletionItems({ + const result = await getCompletionItems({ ast, context: contextAdapter ? contextAdapter(context) : context, cst, @@ -108,6 +124,8 @@ export const getViewCompletionProvider = textDocumentPosition, tokenVector, }); + removeUI5PatchVersion(result); + return result; }; type AttributeValidator = ( diff --git a/packages/binding/test/unit/services/completion/__snapshots__/aggregation-binding.test.ts.snap b/packages/binding/test/unit/services/completion/__snapshots__/aggregation-binding.test.ts.snap index f1dbd27d..3cf39af6 100644 --- a/packages/binding/test/unit/services/completion/__snapshots__/aggregation-binding.test.ts.snap +++ b/packages/binding/test/unit/services/completion/__snapshots__/aggregation-binding.test.ts.snap @@ -15,7 +15,7 @@ Array [ **Optional:** false -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", }, "insertText": "path: '$0'", "insertTextFormat": 2, @@ -35,7 +35,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", }, "insertText": "model: '$0'", "insertTextFormat": 2, @@ -55,7 +55,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", }, "insertText": "template: '$0'", "insertTextFormat": 2, @@ -75,7 +75,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", }, "insertText": "templateShareable: $0", "insertTextFormat": 2, @@ -95,7 +95,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", }, "insertText": "factory: '$0'", "insertTextFormat": 2, @@ -115,7 +115,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", }, "insertText": "suspended: $0", "insertTextFormat": 2, @@ -135,7 +135,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", }, "insertText": "startIndex: $0", "insertTextFormat": 2, @@ -155,7 +155,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", }, "insertText": "length: $0", "insertTextFormat": 2, @@ -175,7 +175,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", }, "insertText": "sorter: $0", "insertTextFormat": 2, @@ -195,7 +195,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", }, "insertText": "filters: $0", "insertTextFormat": 2, @@ -215,7 +215,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", }, "insertText": "key: $0", "insertTextFormat": 2, @@ -235,7 +235,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", }, "insertText": "parameters: {$0}", "insertTextFormat": 2, @@ -255,7 +255,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", }, "insertText": "groupHeaderFactory: '$0'", "insertTextFormat": 2, @@ -275,7 +275,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", }, "insertText": "events: {$0}", "insertTextFormat": 2, @@ -300,7 +300,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "path: '$0'", "insertTextFormat": 2, @@ -320,7 +320,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "test: '$0'", "insertTextFormat": 2, @@ -340,7 +340,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "comparator: '$0'", "insertTextFormat": 2, @@ -360,7 +360,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "operator: '$0'", "insertTextFormat": 2, @@ -380,7 +380,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "value1: $0", "insertTextFormat": 2, @@ -400,7 +400,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "value2: $0", "insertTextFormat": 2, @@ -420,7 +420,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "variable: '$0'", "insertTextFormat": 2, @@ -440,7 +440,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "condition: {$0}", "insertTextFormat": 2, @@ -460,7 +460,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "filters: [{$0}]", "insertTextFormat": 2, @@ -480,7 +480,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "and: $0", "insertTextFormat": 2, @@ -500,7 +500,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "caseSensitive: $0", "insertTextFormat": 2, @@ -525,7 +525,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "path: '$0'", "insertTextFormat": 2, @@ -545,7 +545,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "test: '$0'", "insertTextFormat": 2, @@ -565,7 +565,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "comparator: '$0'", "insertTextFormat": 2, @@ -585,7 +585,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "operator: '$0'", "insertTextFormat": 2, @@ -605,7 +605,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "value1: $0", "insertTextFormat": 2, @@ -625,7 +625,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "value2: $0", "insertTextFormat": 2, @@ -645,7 +645,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "variable: '$0'", "insertTextFormat": 2, @@ -665,7 +665,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "condition: {$0}", "insertTextFormat": 2, @@ -685,7 +685,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "filters: [{$0}]", "insertTextFormat": 2, @@ -705,7 +705,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "and: $0", "insertTextFormat": 2, @@ -725,7 +725,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "caseSensitive: $0", "insertTextFormat": 2, @@ -750,7 +750,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "path: '$0'", "insertTextFormat": 2, @@ -770,7 +770,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "test: '$0'", "insertTextFormat": 2, @@ -790,7 +790,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "comparator: '$0'", "insertTextFormat": 2, @@ -810,7 +810,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "operator: '$0'", "insertTextFormat": 2, @@ -830,7 +830,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "value1: $0", "insertTextFormat": 2, @@ -850,7 +850,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "value2: $0", "insertTextFormat": 2, @@ -870,7 +870,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "variable: '$0'", "insertTextFormat": 2, @@ -890,7 +890,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "condition: {$0}", "insertTextFormat": 2, @@ -910,7 +910,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "filters: [{$0}]", "insertTextFormat": 2, @@ -930,7 +930,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "and: $0", "insertTextFormat": 2, @@ -950,7 +950,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "caseSensitive: $0", "insertTextFormat": 2, @@ -975,7 +975,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "path: '$0'", "insertTextFormat": 2, @@ -995,7 +995,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "test: '$0'", "insertTextFormat": 2, @@ -1015,7 +1015,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "comparator: '$0'", "insertTextFormat": 2, @@ -1035,7 +1035,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "operator: '$0'", "insertTextFormat": 2, @@ -1055,7 +1055,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "value1: $0", "insertTextFormat": 2, @@ -1075,7 +1075,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "value2: $0", "insertTextFormat": 2, @@ -1095,7 +1095,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "variable: '$0'", "insertTextFormat": 2, @@ -1115,7 +1115,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "condition: {$0}", "insertTextFormat": 2, @@ -1135,7 +1135,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "filters: [{$0}]", "insertTextFormat": 2, @@ -1155,7 +1155,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "and: $0", "insertTextFormat": 2, @@ -1175,7 +1175,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "caseSensitive: $0", "insertTextFormat": 2, @@ -1509,7 +1509,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "path: '$0'", "insertTextFormat": 2, @@ -1529,7 +1529,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "test: '$0'", "insertTextFormat": 2, @@ -1549,7 +1549,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "comparator: '$0'", "insertTextFormat": 2, @@ -1569,7 +1569,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "operator: '$0'", "insertTextFormat": 2, @@ -1589,7 +1589,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "value1: $0", "insertTextFormat": 2, @@ -1609,7 +1609,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "value2: $0", "insertTextFormat": 2, @@ -1629,7 +1629,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "variable: '$0'", "insertTextFormat": 2, @@ -1649,7 +1649,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "condition: {$0}", "insertTextFormat": 2, @@ -1669,7 +1669,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "filters: [{$0}]", "insertTextFormat": 2, @@ -1689,7 +1689,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "and: $0", "insertTextFormat": 2, @@ -1709,7 +1709,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "caseSensitive: $0", "insertTextFormat": 2, @@ -1734,7 +1734,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "path: '$0'", "insertTextFormat": 2, @@ -1754,7 +1754,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "test: '$0'", "insertTextFormat": 2, @@ -1774,7 +1774,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "comparator: '$0'", "insertTextFormat": 2, @@ -1794,7 +1794,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "operator: '$0'", "insertTextFormat": 2, @@ -1814,7 +1814,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "value1: $0", "insertTextFormat": 2, @@ -1834,7 +1834,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "value2: $0", "insertTextFormat": 2, @@ -1854,7 +1854,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "variable: '$0'", "insertTextFormat": 2, @@ -1874,7 +1874,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "condition: {$0}", "insertTextFormat": 2, @@ -1894,7 +1894,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "filters: [{$0}]", "insertTextFormat": 2, @@ -1914,7 +1914,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "and: $0", "insertTextFormat": 2, @@ -1934,7 +1934,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Filter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Filter)", }, "insertText": "caseSensitive: $0", "insertTextFormat": 2, @@ -1959,7 +1959,7 @@ Array [ **Optional:** false -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Sorter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Sorter)", }, "insertText": "path: '$0'", "insertTextFormat": 2, @@ -1979,7 +1979,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Sorter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Sorter)", }, "insertText": "descending: $0", "insertTextFormat": 2, @@ -1999,7 +1999,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Sorter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Sorter)", }, "insertText": "group: $0", "insertTextFormat": 2, @@ -2019,7 +2019,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Sorter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Sorter)", }, "insertText": "comparator: '$0'", "insertTextFormat": 2, @@ -2044,7 +2044,7 @@ Array [ **Optional:** false -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Sorter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Sorter)", }, "insertText": "path: '$0'", "insertTextFormat": 2, @@ -2064,7 +2064,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Sorter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Sorter)", }, "insertText": "descending: $0", "insertTextFormat": 2, @@ -2084,7 +2084,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Sorter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Sorter)", }, "insertText": "group: $0", "insertTextFormat": 2, @@ -2104,7 +2104,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.model.Sorter)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.model.Sorter)", }, "insertText": "comparator: '$0'", "insertTextFormat": 2, @@ -2113,3 +2113,596 @@ Array [ }, ] `; + +exports[`aggregation binding tooltip [altTypes] - contains both aggregation and property binding info 1`] = ` +Array [ + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.AggregationBindingInfo\` + + + +**Type:** String + +**Description:** Path in the model to bind to, either an absolute path or relative to the binding context for the corresponding model; when the path contains a '>' sign, the string preceding it will override the model property and the remainder after the '>' will be used as binding path + +**Optional:** false + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", + }, + "insertText": "path: '$0'", + "insertTextFormat": 2, + "kind": 15, + "label": "path", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.AggregationBindingInfo\` + + + +**Type:** String + +**Description:** Name of the model to bind against; when undefined or omitted, the default model is used + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", + }, + "insertText": "model: '$0'", + "insertTextFormat": 2, + "kind": 15, + "label": "model", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.AggregationBindingInfo\` + + + +**Type:** sap.ui.base.ManagedObject + +**Description:** The template to clone for each item in the aggregation; either a template or a factory must be given + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", + }, + "insertText": "template: '$0'", + "insertTextFormat": 2, + "kind": 15, + "label": "template", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.AggregationBindingInfo\` + + + +**Type:** Boolean + +**Description:** Whether the framework should assume that the application takes care of the lifecycle of the given template; when set to true, the template can be used in multiple bindings, either in parallel or over time, and the framework won't clone it when this ManagedObject is cloned; when set to false, the lifecycle of the template is bound to the lifecycle of the binding, when the aggregation is unbound or when this ManagedObject is destroyed, the template also will be destroyed, and when this ManagedObject is cloned, the template will be cloned as well; the third option (undefined) only exists for compatibility reasons, its behavior is not fully reliable and it may leak the template + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", + }, + "insertText": "templateShareable: $0", + "insertTextFormat": 2, + "kind": 15, + "label": "templateShareable", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.AggregationBindingInfo\` + + + +**Type:** Function + +**Description:** A factory function that will be called to create an object for each item in the aggregation; this is an alternative to providing a template object and can be used when the objects should differ depending on the binding context; the factory function will be called with two parameters: an ID that should be used for the created object and the binding context for which the object has to be created; the function must return an object appropriate for the bound aggregation + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", + }, + "insertText": "factory: '$0'", + "insertTextFormat": 2, + "kind": 15, + "label": "factory", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.AggregationBindingInfo\` + + + +**Type:** Boolean + +**Description:** Whether the binding should be suspended initially + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", + }, + "insertText": "suspended: $0", + "insertTextFormat": 2, + "kind": 15, + "label": "suspended", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.AggregationBindingInfo\` + + + +**Type:** Integer + +**Description:** the first entry of the list to be created + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", + }, + "insertText": "startIndex: $0", + "insertTextFormat": 2, + "kind": 15, + "label": "startIndex", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.AggregationBindingInfo\` + + + +**Type:** Integer + +**Description:** The amount of entries to be created (may exceed the size limit of the model) + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", + }, + "insertText": "length: $0", + "insertTextFormat": 2, + "kind": 15, + "label": "length", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.AggregationBindingInfo\` + + + +**Type:** Array<(sap.ui.model.Sorter)> | sap.ui.model.Sorter + +**Description:** The initial sort order (optional) + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", + }, + "insertText": "sorter: $0", + "insertTextFormat": 2, + "kind": 15, + "label": "sorter", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.AggregationBindingInfo\` + + + +**Type:** Array<(sap.ui.model.Filter)> | sap.ui.model.Filter + +**Description:** The predefined filters for this aggregation (optional) + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", + }, + "insertText": "filters: $0", + "insertTextFormat": 2, + "kind": 15, + "label": "filters", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.AggregationBindingInfo\` + + + +**Type:** String | Function + +**Description:** Name of the key property or a function getting the context as only parameter to calculate a key for entries. This can be used to improve update behaviour in models, where a key is not already available. + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", + }, + "insertText": "key: $0", + "insertTextFormat": 2, + "kind": 15, + "label": "key", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.AggregationBindingInfo\` + + + +**Type:** Object + +**Description:** Map of additional parameters for this binding; the names and value ranges of the supported parameters depend on the model implementation, they should be documented with the bindList method of the corresponding model class or with the model specific subclass of sap.ui.model.ListBinding + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", + }, + "insertText": "parameters: {$0}", + "insertTextFormat": 2, + "kind": 15, + "label": "parameters", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.AggregationBindingInfo\` + + + +**Type:** Function + +**Description:** A factory function to generate custom group visualization (optional). It should return a control suitable to visualize a group header (e.g. a sap.m.GroupHeaderListItem for a sap.m.List). + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", + }, + "insertText": "groupHeaderFactory: '$0'", + "insertTextFormat": 2, + "kind": 15, + "label": "groupHeaderFactory", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.AggregationBindingInfo\` + + + +**Type:** Object + +**Description:** Map of event handler functions keyed by the name of the binding events that they should be attached to + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.AggregationBindingInfo)", + }, + "insertText": "events: {$0}", + "insertTextFormat": 2, + "kind": 15, + "label": "events", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` + + + +**Type:** String + +**Description:** Path in the model to bind to, either an absolute path or relative to the binding context for the corresponding model; when the path contains a '>' sign, the string preceding it will override the model property and the remainder after the '>' will be used as binding path + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", + }, + "insertText": "path: '$0'", + "insertTextFormat": 2, + "kind": 15, + "label": "path", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` + + + +**Type:** String + +**Description:** Since 1.61, defines a static binding with the given value. + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", + }, + "insertText": "value: '$0'", + "insertTextFormat": 2, + "kind": 15, + "label": "value", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` + + + +**Type:** String + +**Description:** Name of the model to bind against; when undefined or omitted, the default model is used + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", + }, + "insertText": "model: '$0'", + "insertTextFormat": 2, + "kind": 15, + "label": "model", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` + + + +**Type:** Boolean + +**Description:** Whether the binding should be suspended initially + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", + }, + "insertText": "suspended: $0", + "insertTextFormat": 2, + "kind": 15, + "label": "suspended", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` + + + +**Type:** Function + +**Description:** Function to convert model data into a property value + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", + }, + "insertText": "formatter: '$0'", + "insertTextFormat": 2, + "kind": 15, + "label": "formatter", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` + + + +**Type:** Boolean + +**Description:** Whether the parameters to the formatter function should be passed as raw values. In this case the specified types for the binding parts are not used and the values are not formatted. + +Note: use this flag only when using multiple bindings. If you use only one binding and want raw values then simply don't specify a type for that binding. + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", + }, + "insertText": "useRawValues: $0", + "insertTextFormat": 2, + "kind": 15, + "label": "useRawValues", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` + + + +**Type:** Boolean + +**Description:** Whether the parameters to the formatter function should be passed as the related JavaScript primitive values. In this case the values of the model are parsed by the {@link sap.ui.model.SimpleType#getModelFormat model format} of the specified types from the binding parts. + +Note: use this flag only when using multiple bindings. + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", + }, + "insertText": "useInternalValues: $0", + "insertTextFormat": 2, + "kind": 15, + "label": "useInternalValues", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` + + + +**Type:** sap.ui.model.Type | String + +**Description:** A type object or the name of a type class to create such a type object; the type will be used for converting model data to a property value (aka \\"formatting\\") and vice versa (in binding mode TwoWay, aka \\"parsing\\") + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", + }, + "insertText": "type: '$0'", + "insertTextFormat": 2, + "kind": 15, + "label": "type", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` + + + +**Type:** String + +**Description:** Target type to be used by the type when formatting model data, for example \\"boolean\\" or \\"string\\" or \\"any\\"; defaults to the property's type + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", + }, + "insertText": "targetType: '$0'", + "insertTextFormat": 2, + "kind": 15, + "label": "targetType", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` + + + +**Type:** Object + +**Description:** Format options to be used for the type; only taken into account when the type is specified by its name - a given type object won't be modified + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", + }, + "insertText": "formatOptions: {$0}", + "insertTextFormat": 2, + "kind": 15, + "label": "formatOptions", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` + + + +**Type:** Object + +**Description:** Additional constraints to be used when constructing a type object from a type name, ignored when a type object is given + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", + }, + "insertText": "constraints: {$0}", + "insertTextFormat": 2, + "kind": 15, + "label": "constraints", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` + + + +**Type:** sap.ui.model.BindingMode + +**Description:** Binding mode to be used for this property binding (e.g. one way) + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", + }, + "insertText": "mode: '$0'", + "insertTextFormat": 2, + "kind": 15, + "label": "mode", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` + + + +**Type:** Object + +**Description:** Map of additional parameters for this binding; the names and value ranges of the supported parameters depend on the model implementation, they should be documented with the bindProperty method of the corresponding model class or with the model specific subclass of sap.ui.model.PropertyBinding + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", + }, + "insertText": "parameters: {$0}", + "insertTextFormat": 2, + "kind": 15, + "label": "parameters", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` + + + +**Type:** Object + +**Description:** Map of event handler functions keyed by the name of the binding events that they should be attached to + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", + }, + "insertText": "events: {$0}", + "insertTextFormat": 2, + "kind": 15, + "label": "events", + }, + Object { + "documentation": Object { + "kind": "markdown", + "value": "\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` + + + +**Type:** Array<(String | sap.ui.base.ManagedObject.PropertyBindingInfo)> + +**Description:** Array of binding info objects for the parts of a composite binding; the structure of each binding info is the same as described for the oBindingInfo as a whole. + +If a part is not specified as a binding info object but as a simple string, a binding info object will be created with that string as path. The string may start with a model name prefix (see property path). + +Note: recursive composite bindings are currently not supported. Therefore, a part must not contain a parts property. + +**Optional:** true + +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", + }, + "insertText": "parts: $0", + "insertTextFormat": 2, + "kind": 15, + "label": "parts", + }, +] +`; diff --git a/packages/binding/test/unit/services/completion/__snapshots__/property-binding-info.test.ts.snap b/packages/binding/test/unit/services/completion/__snapshots__/property-binding-info.test.ts.snap index 16e757ad..b60746a2 100644 --- a/packages/binding/test/unit/services/completion/__snapshots__/property-binding-info.test.ts.snap +++ b/packages/binding/test/unit/services/completion/__snapshots__/property-binding-info.test.ts.snap @@ -36,7 +36,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", "label: value; text: value: '$0'; kind:15; commit:undefined; sort:; documentation: kind:markdown,value:\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` @@ -47,7 +47,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", "label: model; text: model: '$0'; kind:15; commit:undefined; sort:; documentation: kind:markdown,value:\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` @@ -58,7 +58,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", "label: suspended; text: suspended: $0; kind:15; commit:undefined; sort:; documentation: kind:markdown,value:\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` @@ -69,7 +69,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", "label: formatter; text: formatter: '$0'; kind:15; commit:undefined; sort:; documentation: kind:markdown,value:\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` @@ -80,7 +80,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", "label: useRawValues; text: useRawValues: $0; kind:15; commit:undefined; sort:; documentation: kind:markdown,value:\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` @@ -93,7 +93,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", "label: useInternalValues; text: useInternalValues: $0; kind:15; commit:undefined; sort:; documentation: kind:markdown,value:\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` @@ -106,7 +106,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", "label: type; text: type: '$0'; kind:15; commit:undefined; sort:; documentation: kind:markdown,value:\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` @@ -117,7 +117,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", "label: targetType; text: targetType: '$0'; kind:15; commit:undefined; sort:; documentation: kind:markdown,value:\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` @@ -128,7 +128,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", "label: formatOptions; text: formatOptions: {$0}; kind:15; commit:undefined; sort:; documentation: kind:markdown,value:\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` @@ -139,7 +139,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", "label: constraints; text: constraints: {$0}; kind:15; commit:undefined; sort:; documentation: kind:markdown,value:\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` @@ -150,7 +150,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", "label: mode; text: mode: '$0'; kind:15; commit:undefined; sort:; documentation: kind:markdown,value:\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` @@ -161,7 +161,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", "label: parameters; text: parameters: {$0}; kind:15; commit:undefined; sort:; documentation: kind:markdown,value:\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` @@ -172,7 +172,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", "label: events; text: events: {$0}; kind:15; commit:undefined; sort:; documentation: kind:markdown,value:\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` @@ -183,7 +183,7 @@ Array [ **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", "label: parts; text: parts: $0; kind:15; commit:undefined; sort:; documentation: kind:markdown,value:\`(typedef) sap.ui.base.ManagedObject.PropertyBindingInfo\` @@ -198,7 +198,7 @@ If a part is not specified as a binding info object but as a simple string, a bi **Optional:** true -[More information](https://ui5.sap.com/1.108.26/#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", +[More information](https://ui5.sap.com/1.108#/api/sap.ui.base.ManagedObject.PropertyBindingInfo)", ] `; diff --git a/packages/binding/test/unit/services/completion/aggregation-binding.test.ts b/packages/binding/test/unit/services/completion/aggregation-binding.test.ts index a8199144..8cb5b796 100644 --- a/packages/binding/test/unit/services/completion/aggregation-binding.test.ts +++ b/packages/binding/test/unit/services/completion/aggregation-binding.test.ts @@ -218,4 +218,10 @@ describe("aggregation binding", () => { }); }); }); + it("tooltip [altTypes] - contains both aggregation and property binding info", async () => { + const snippet = ` + `; + const result = await getCompletionResult(snippet); + expect(result).toMatchSnapshot(); + }); }); diff --git a/packages/binding/test/unit/services/diagnostics/validators/aggregation-binding-validator.test.ts b/packages/binding/test/unit/services/diagnostics/validators/aggregation-binding-validator.test.ts index b95b1a13..98fd3a1b 100644 --- a/packages/binding/test/unit/services/diagnostics/validators/aggregation-binding-validator.test.ts +++ b/packages/binding/test/unit/services/diagnostics/validators/aggregation-binding-validator.test.ts @@ -228,4 +228,10 @@ describe("aggregation binding", () => { }); }); }); + it("tooltip [altTypes]", async () => { + const snippet = ` + `; + const result = await validateView(snippet); + expect(result.map((item) => issueToSnapshot(item))).toStrictEqual([]); + }); }); diff --git a/packages/binding/test/unit/utils/element.test.ts b/packages/binding/test/unit/utils/element.test.ts index b33fd297..0badae86 100644 --- a/packages/binding/test/unit/utils/element.test.ts +++ b/packages/binding/test/unit/utils/element.test.ts @@ -9,7 +9,9 @@ import { TestFramework, } from "@ui5-language-assistant/test-framework"; import { join } from "path"; +import type { UI5Aggregation } from "@ui5-language-assistant/semantic-model-types"; +const aggregation = {} as UI5Aggregation; let context: BindContext; describe("element", () => { describe("typesToValue", () => { @@ -116,7 +118,7 @@ describe("element", () => { }); describe('type.kind === "integer" [forDiagnostic]', () => { it("type.collection && collectionValue === false", () => { - let el = getBindingElements(context, true).find( + let el = getBindingElements(context, aggregation).find( (i) => i.name === "startIndex" ) as BindingInfoElement; // for test - set collection as true @@ -131,7 +133,7 @@ describe("element", () => { expect(result).toStrictEqual(["collection of integer"]); }); it("integer", () => { - const el = getBindingElements(context, true).find( + const el = getBindingElements(context, aggregation).find( (i) => i.name === "startIndex" ) as BindingInfoElement; const result = typesToValue({ diff --git a/packages/language-server/src/documentation.ts b/packages/language-server/src/documentation.ts index 2f4a8894..343865d0 100644 --- a/packages/language-server/src/documentation.ts +++ b/packages/language-server/src/documentation.ts @@ -96,7 +96,9 @@ export function getNodeDetail(node: BaseUI5Node): string { case "UI5Aggregation": return `(aggregation) ${node.name}: ${typeToString( (node as UI5Aggregation).type - )}`; + )}\n\nAlternative types: ${(node as UI5Aggregation).altTypes + .map((i) => typeToString(i)) + .join(",")}`; case "UI5Association": return `(association) ${node.name}: ${typeToString( (node as UI5Association).type diff --git a/packages/language-server/src/hover.ts b/packages/language-server/src/hover.ts index 67309dcd..9ea16e60 100644 --- a/packages/language-server/src/hover.ts +++ b/packages/language-server/src/hover.ts @@ -59,6 +59,8 @@ function transformToLspHover( } function addTitle(title: string, documentation: MarkupContent): MarkupContent { - const markupWithTitle = `\`${title}\`\n\n---\n${documentation.value}`; + const markupWithTitle = `\`${title.split("\n\n").join("`\n\n`")}\`\n\n---\n${ + documentation.value + }`; return { kind: MarkupKind.Markdown, value: markupWithTitle }; } diff --git a/packages/language-server/test/unit/hover.test.ts b/packages/language-server/test/unit/hover.test.ts index dc61f6bd..6e9636cc 100644 --- a/packages/language-server/test/unit/hover.test.ts +++ b/packages/language-server/test/unit/hover.test.ts @@ -88,6 +88,19 @@ describe("the UI5 language assistant Hover Tooltip Service", () => { const response = getHoverItem(xmlSnippet, appContext); expect(response).toBeUndefined(); }); + it("will get hover content UI5 property - alt types", () => { + const xmlSnippet = ` + + + + `; + const response = getHoverItem(xmlSnippet, appContext); + expectExists(response, "Hover item"); + assertMarkup(response.contents); + expect(response.contents.value).toInclude("Alternative types: String"); + }); }); describe("hover on attribute value", () => { diff --git a/packages/vscode-ui5-language-assistant/src/utils/binding-semantic-token-creator.ts b/packages/vscode-ui5-language-assistant/src/utils/binding-semantic-token-creator.ts index 3283e4bf..6a0188d2 100644 --- a/packages/vscode-ui5-language-assistant/src/utils/binding-semantic-token-creator.ts +++ b/packages/vscode-ui5-language-assistant/src/utils/binding-semantic-token-creator.ts @@ -218,7 +218,7 @@ const walkAttributes = ( attr, context.ui5Model ); - const bindingInfo = getBindingElements(context, !!ui5Aggregation); + const bindingInfo = getBindingElements(context, ui5Aggregation); const properties = bindingInfo.map((i) => i.name); for (const binding of ast.bindings) {