private getPropertyCompletions()

in src/services/jsonCompletion.ts [227:296]


	private getPropertyCompletions(schema: SchemaService.ResolvedSchema, doc: Parser.JSONDocument, node: ASTNode, addValue: boolean, separatorAfter: string, collector: CompletionsCollector): void {
		const matchingSchemas = doc.getMatchingSchemas(schema.schema, node.offset);
		matchingSchemas.forEach((s) => {
			if (s.node === node && !s.inverted) {
				const schemaProperties = s.schema.properties;
				if (schemaProperties) {
					Object.keys(schemaProperties).forEach((key: string) => {
						const propertySchema = schemaProperties[key];
						if (typeof propertySchema === 'object' && !propertySchema.deprecationMessage && !propertySchema.doNotSuggest) {
							const proposal: CompletionItem = {
								kind: CompletionItemKind.Property,
								label: key,
								insertText: this.getInsertTextForProperty(key, propertySchema, addValue, separatorAfter),
								insertTextFormat: InsertTextFormat.Snippet,
								filterText: this.getFilterTextForValue(key),
								documentation: this.fromMarkup(propertySchema.markdownDescription) || propertySchema.description || '',
							};
							if (propertySchema.suggestSortText !== undefined) {
								proposal.sortText = propertySchema.suggestSortText;
							}
							if (proposal.insertText && endsWith(proposal.insertText, `$1${separatorAfter}`)) {
								proposal.command = {
									title: 'Suggest',
									command: 'editor.action.triggerSuggest'
								};
							}
							collector.add(proposal);
						}
					});
				}
				const schemaPropertyNames = s.schema.propertyNames;
				if (typeof schemaPropertyNames === 'object' && !schemaPropertyNames.deprecationMessage && !schemaPropertyNames.doNotSuggest) {
					const propertyNameCompletionItem = (name: string, enumDescription: string | MarkupContent | undefined = undefined) => {
						const proposal: CompletionItem = {
							kind: CompletionItemKind.Property,
							label: name,
							insertText: this.getInsertTextForProperty(name, undefined, addValue, separatorAfter),
							insertTextFormat: InsertTextFormat.Snippet,
							filterText: this.getFilterTextForValue(name),
							documentation: enumDescription || this.fromMarkup(schemaPropertyNames.markdownDescription) || schemaPropertyNames.description || '',
						};
						if (schemaPropertyNames.suggestSortText !== undefined) {
							proposal.sortText = schemaPropertyNames.suggestSortText;
						}
						if (proposal.insertText && endsWith(proposal.insertText, `$1${separatorAfter}`)) {
							proposal.command = {
								title: 'Suggest',
								command: 'editor.action.triggerSuggest'
							};
						}
						collector.add(proposal);
					};
					if (schemaPropertyNames.enum) {
						for (let i = 0; i < schemaPropertyNames.enum.length; i++) {
							let enumDescription = undefined;
							if (schemaPropertyNames.markdownEnumDescriptions && i < schemaPropertyNames.markdownEnumDescriptions.length) {
								enumDescription = this.fromMarkup(schemaPropertyNames.markdownEnumDescriptions[i]);
							} else if (schemaPropertyNames.enumDescriptions && i < schemaPropertyNames.enumDescriptions.length) {
								enumDescription = schemaPropertyNames.enumDescriptions[i];
							}
							propertyNameCompletionItem(schemaPropertyNames.enum[i], enumDescription);
						}
					}
					if (schemaPropertyNames.const) {
						propertyNameCompletionItem(schemaPropertyNames.const);
					}
				}
			}
		});
	}