UNPKG

apollo-language-server

Version:

A language server for Apollo GraphQL projects

116 lines 4.82 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getASTNodeAndTypeInfoAtPosition = exports.positionToOffset = exports.positionFromSourceLocation = exports.rangeForASTNode = exports.rangeInContainingDocument = exports.positionInContainingDocument = exports.positionFromPositionInContainingDocument = exports.visitWithTypeInfo = void 0; const graphql_1 = require("graphql"); const location_1 = require("graphql/language/location"); const vscode_languageserver_1 = require("vscode-languageserver"); const graphql_2 = require("./graphql"); function visitWithTypeInfo(typeInfo, visitor) { return { enter(node) { typeInfo.enter(node); const fn = (0, graphql_1.getVisitFn)(visitor, node.kind, false); if (fn) { const result = fn.apply(visitor, arguments); if (result !== undefined) { typeInfo.leave(node); if ((0, graphql_2.isNode)(result)) { typeInfo.enter(result); } } return result; } }, leave(node) { const fn = (0, graphql_1.getVisitFn)(visitor, node.kind, true); let result; if (fn) { result = fn.apply(visitor, arguments); } if (result !== graphql_1.BREAK) { typeInfo.leave(node); } return result; }, }; } exports.visitWithTypeInfo = visitWithTypeInfo; function positionFromPositionInContainingDocument(source, position) { if (!source.locationOffset) return position; return vscode_languageserver_1.Position.create(position.line - (source.locationOffset.line - 1), position.character); } exports.positionFromPositionInContainingDocument = positionFromPositionInContainingDocument; function positionInContainingDocument(source, position) { if (!source.locationOffset) return position; return vscode_languageserver_1.Position.create(source.locationOffset.line - 1 + position.line, position.character); } exports.positionInContainingDocument = positionInContainingDocument; function rangeInContainingDocument(source, range) { if (!source.locationOffset) return range; return vscode_languageserver_1.Range.create(positionInContainingDocument(source, range.start), positionInContainingDocument(source, range.end)); } exports.rangeInContainingDocument = rangeInContainingDocument; function rangeForASTNode(node) { const location = node.loc; const source = location.source; return vscode_languageserver_1.Range.create(positionFromSourceLocation(source, (0, location_1.getLocation)(source, location.start)), positionFromSourceLocation(source, (0, location_1.getLocation)(source, location.end))); } exports.rangeForASTNode = rangeForASTNode; function positionFromSourceLocation(source, location) { return vscode_languageserver_1.Position.create((source.locationOffset ? source.locationOffset.line - 1 : 0) + location.line - 1, (source.locationOffset && location.line === 1 ? source.locationOffset.column - 1 : 0) + location.column - 1); } exports.positionFromSourceLocation = positionFromSourceLocation; function positionToOffset(source, position) { const lineRegexp = /\r\n|[\n\r]/g; const lineEndingLength = /\r\n/g.test(source.body) ? 2 : 1; const linesUntilPosition = source.body .split(lineRegexp) .slice(0, position.line); return (position.character + linesUntilPosition .map((line) => line.length + lineEndingLength) .reduce((a, b) => a + b, 0)); } exports.positionToOffset = positionToOffset; function getASTNodeAndTypeInfoAtPosition(source, position, root, schema) { const offset = positionToOffset(source, position); let nodeContainingPosition = null; const typeInfo = new graphql_1.TypeInfo(schema); (0, graphql_1.visit)(root, visitWithTypeInfo(typeInfo, { enter(node) { if (node.kind !== graphql_1.Kind.NAME && node.loc && node.loc.start <= offset && offset <= node.loc.end) { nodeContainingPosition = node; } else { return false; } return; }, leave(node) { if (node.loc && node.loc.start <= offset && offset <= node.loc.end) { return graphql_1.BREAK; } return; }, })); if (nodeContainingPosition) { return [nodeContainingPosition, typeInfo]; } else { return null; } } exports.getASTNodeAndTypeInfoAtPosition = getASTNodeAndTypeInfoAtPosition; //# sourceMappingURL=source.js.map