blob: ae3f0aa606ecb08e6ab986d7b1fef3b406128f01 [file] [log] [blame]
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _utilities = require('../../utilities');
var hasLineBreak = function hasLineBreak(direction, colon, context) {
var sourceCode = context.getSourceCode();
if (direction === 'before') {
return colon.loc.start.line !== sourceCode.getTokenBefore(colon).loc.end.line;
} else {
return sourceCode.getTokenAfter(colon).loc.start.line !== colon.loc.end.line;
}
};
var getSpaces = function getSpaces(direction, colon, context) {
var sourceCode = context.getSourceCode();
if (direction === 'before') {
return colon.start - sourceCode.getTokenBefore(colon).end;
} else {
return sourceCode.getTokenAfter(colon).start - colon.end;
}
};
exports.default = function (direction, context, _ref) {
var always = _ref.always,
allowLineBreak = _ref.allowLineBreak;
return function (_ref2) {
var colon = _ref2.colon,
node = _ref2.node,
_ref2$name = _ref2.name,
name = _ref2$name === undefined ? '' : _ref2$name,
_ref2$type = _ref2.type,
type = _ref2$type === undefined ? 'type annotation' : _ref2$type;
var lineBreak = void 0;
var spaces = void 0;
// Support optional names
// type X = { [string]: a }
// type X = string => string
if (!colon || colon.value !== ':') {
return;
}
var data = {
direction,
name,
type
};
if (hasLineBreak(direction, colon, context)) {
if (allowLineBreak) {
spaces = 1;
} else {
lineBreak = true;
spaces = getSpaces(direction, colon, context);
}
} else {
spaces = getSpaces(direction, colon, context);
}
if (always && lineBreak) {
context.report({
data,
fix: _utilities.spacingFixers.replaceWithSpace(direction, colon, spaces),
message: 'There must not be a line break {{direction}} {{name}}{{type}} colon.',
node
});
} else if (always && spaces > 1) {
context.report({
data,
fix: _utilities.spacingFixers.stripSpaces(direction, colon, spaces - 1),
message: 'There must be 1 space {{direction}} {{name}}{{type}} colon.',
node
});
} else if (always && spaces === 0) {
context.report({
data,
fix: _utilities.spacingFixers.addSpace(direction, colon),
message: 'There must be a space {{direction}} {{name}}{{type}} colon.',
node
});
} else if (!always && spaces > 0) {
context.report({
data,
fix: _utilities.spacingFixers.stripSpaces(direction, colon, spaces),
message: 'There must be no space {{direction}} {{name}}{{type}} colon.',
node
});
}
};
};
module.exports = exports.default;