in language-service/src/services/yamlCompletion.ts [301:378]
private getValueCompletions(schema: SchemaService.ResolvedSchema, doc: SingleYAMLDocument, node: Parser.ASTNode, offset: number, document: TextDocument, collector: CompletionsCollector, types: { [type: string]: boolean }): void {
let offsetForSeparator = offset;
let parentKey: string = null;
if (node && (node.type === 'string' || node.type === 'number' || node.type === 'boolean')) {
offsetForSeparator = node.end;
node = node.parent;
}
if (node && node.type === 'null') {
let nodeParent = node.parent;
/*
* This is going to be an object for some reason and we need to find the property
* Its an issue with the null node
*/
if (nodeParent && nodeParent.type === "object") {
for (let prop in nodeParent["properties"]) {
let currNode = nodeParent["properties"][prop];
if (currNode.key && currNode.key.location === node.location) {
node = currNode;
}
}
}
}
if (!node) {
this.addSchemaValueCompletions(schema.schema, collector, types, "");
return;
}
if ((node.type === 'property') && offset > (<Parser.PropertyASTNode>node).colonOffset) {
let propertyNode = <Parser.PropertyASTNode>node;
let valueNode = propertyNode.value;
if (valueNode && offset > valueNode.end) {
return; // we are past the value node
}
parentKey = propertyNode.key.value;
node = node.parent;
}
let separatorAfter = this.evaluateSeparatorAfter(document, offsetForSeparator);
if (node && (parentKey !== null || node.type === 'array')) {
let matchingSchemas = doc.getMatchingSchemas(schema.schema);
matchingSchemas.forEach(s => {
if (s.node === node && !s.inverted && s.schema) {
if (s.schema.items) {
if (Array.isArray(s.schema.items)) {
let index = this.findItemAtOffset(node, document, offset);
if (index < s.schema.items.length) {
this.addSchemaValueCompletions(s.schema.items[index], collector, types, separatorAfter);
}
} else {
this.addSchemaValueCompletions(s.schema.items, collector, types, separatorAfter);
}
}
if (s.schema.properties) {
//console.log('property schema');
let propertySchema = s.schema.properties[parentKey];
if (propertySchema) {
this.addSchemaValueCompletions(propertySchema, collector, types, separatorAfter);
}
}
}
});
}
if (node) {
if (types['boolean']) {
this.addBooleanValueCompletion(true, collector, separatorAfter);
this.addBooleanValueCompletion(false, collector, separatorAfter);
}
if (types['null']) {
this.addNullValueCompletion(collector, separatorAfter);
}
}
}