gremlint
Version:
Linter/code formatter for Gremlin
94 lines (93 loc) • 4.79 kB
JavaScript
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.formatMethod = void 0;
var recreateQueryOnelinerFromSyntaxTree_1 = require("../recreateQueryOnelinerFromSyntaxTree");
var types_1 = require("../types");
var utils_1 = require("../utils");
var utils_2 = require("./utils");
// Groups arguments into argument groups an adds a localIndentation property
var formatMethod = function (formatSyntaxTree) { return function (config) { return function (syntaxTree) {
var recreatedQuery = (0, recreateQueryOnelinerFromSyntaxTree_1.default)(config.localIndentation)(syntaxTree);
var method = formatSyntaxTree((0, utils_2.withNoEndDotInfo)(config))(syntaxTree.method);
var argumentsWillNotBeWrapped = recreatedQuery.length <= config.maxLineLength;
if (argumentsWillNotBeWrapped) {
return {
type: types_1.TokenType.Method,
method: method,
// The arguments property is here so that the resulted syntax tree can
// still be understood by recreateQueryOnelinerFromSyntaxTree
arguments: syntaxTree.arguments,
argumentGroups: [
syntaxTree.arguments.reduce(function (argumentGroup, syntaxTree) {
return __spreadArray(__spreadArray([], argumentGroup, true), [
formatSyntaxTree(
// Since the method's arguments will be on the same line, their horizontal position is increased by the
// method's width plus the width of the opening parenthesis
(0, utils_1.pipe)(utils_2.withZeroIndentation, utils_2.withZeroDotInfo, (0, utils_2.withIncreasedHorizontalPosition)(method.width + 1 + argumentGroup.map(function (_a) {
var width = _a.width;
return width;
}).reduce(utils_1.sum, 0) + argumentGroup.length))(config))(syntaxTree),
], false);
}, []),
],
argumentsShouldStartOnNewLine: false,
localIndentation: config.localIndentation,
shouldStartWithDot: false,
shouldEndWithDot: Boolean(config.shouldEndWithDot),
width: recreatedQuery.trim().length,
};
}
// shouldEndWithDot has to reside on the method object, so the end dot can be
// placed after the method parentheses. shouldStartWithDot has to be passed on
// further down so the start dot can be placed after the indentation.
var argumentGroups = syntaxTree.arguments.map(function (step) { return [
formatSyntaxTree((0, utils_1.pipe)((0, utils_2.withIncreasedIndentation)(2), utils_2.withZeroDotInfo, (0, utils_2.withHorizontalPosition)(config.localIndentation + 2))(config))(step),
]; });
var lastArgumentGroup = (0, utils_1.last)(argumentGroups);
// Add the width of the last line of parameters, the dots between them and the indentation of the parameters
var width = lastArgumentGroup
? lastArgumentGroup.map(function (_a) {
var width = _a.width;
return width;
}).reduce(utils_1.sum, 0) + lastArgumentGroup.length - 1
: 0;
return {
type: types_1.TokenType.Method,
method: method,
arguments: syntaxTree.arguments,
argumentGroups: argumentGroups,
argumentsShouldStartOnNewLine: true,
shouldStartWithDot: false,
shouldEndWithDot: Boolean(config.shouldEndWithDot),
localIndentation: 0,
width: width,
};
}; }; };
exports.formatMethod = formatMethod;
;