(function (factory) { if (typeof module === "object" && typeof module.exports === "object") { var v = factory(require, exports); if (v !== undefined) module.exports = v; } else if (typeof define === "function" && define.amd) { define(["require", "exports", "../utils/strings"], factory); } })(function (require, exports) { /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.ParseErrorCollector = exports.Marker = exports.Level = exports.Module = exports.GuardCondition = exports.LessGuard = exports.ListEntry = exports.UnknownAtRule = exports.MixinDeclaration = exports.MixinReference = exports.MixinContentDeclaration = exports.MixinContentReference = exports.ExtendsReference = exports.Variable = exports.Interpolation = exports.VariableDeclaration = exports.NumericValue = exports.RatioValue = exports.HexColorValue = exports.Operator = exports.AttributeSelector = exports.Term = exports.BinaryExpression = exports.Expression = exports.PageBoxMarginBox = exports.Page = exports.SupportsCondition = exports.MediaFeature = exports.MediaCondition = exports.MediaQuery = exports.Medialist = exports.Document = exports.PropertyAtRule = exports.Layer = exports.Supports = exports.Media = exports.Namespace = exports.ForwardVisibility = exports.Forward = exports.ModuleConfiguration = exports.Use = exports.Import = exports.KeyframeSelector = exports.Keyframe = exports.NestedProperties = exports.FontFace = exports.ViewPort = exports.FunctionDeclaration = exports.ElseStatement = exports.WhileStatement = exports.EachStatement = exports.ForStatement = exports.IfStatement = exports.FunctionArgument = exports.FunctionParameter = exports.Function = exports.Invocation = exports.Property = exports.CustomPropertyDeclaration = exports.Declaration = exports.CustomPropertySet = exports.AbstractDeclaration = exports.AtApplyRule = exports.SimpleSelector = exports.Selector = exports.RuleSet = exports.BodyDeclaration = exports.Declarations = exports.Stylesheet = exports.Identifier = exports.UnicodeRange = exports.Nodelist = exports.Node = exports.getParentDeclaration = exports.getNodePath = exports.getNodeAtOffset = exports.ReferenceType = exports.NodeType = void 0; const strings_1 = require("../utils/strings"); /// /// Nodes for the css 2.1 specification. See for reference: /// http://www.w3.org/TR/CSS21/grammar.html#grammar /// var NodeType; (function (NodeType) { NodeType[NodeType["Undefined"] = 0] = "Undefined"; NodeType[NodeType["Identifier"] = 1] = "Identifier"; NodeType[NodeType["Stylesheet"] = 2] = "Stylesheet"; NodeType[NodeType["Ruleset"] = 3] = "Ruleset"; NodeType[NodeType["Selector"] = 4] = "Selector"; NodeType[NodeType["SimpleSelector"] = 5] = "SimpleSelector"; NodeType[NodeType["SelectorInterpolation"] = 6] = "SelectorInterpolation"; NodeType[NodeType["SelectorCombinator"] = 7] = "SelectorCombinator"; NodeType[NodeType["SelectorCombinatorParent"] = 8] = "SelectorCombinatorParent"; NodeType[NodeType["SelectorCombinatorSibling"] = 9] = "SelectorCombinatorSibling"; NodeType[NodeType["SelectorCombinatorAllSiblings"] = 10] = "SelectorCombinatorAllSiblings"; NodeType[NodeType["SelectorCombinatorShadowPiercingDescendant"] = 11] = "SelectorCombinatorShadowPiercingDescendant"; NodeType[NodeType["Page"] = 12] = "Page"; NodeType[NodeType["PageBoxMarginBox"] = 13] = "PageBoxMarginBox"; NodeType[NodeType["ClassSelector"] = 14] = "ClassSelector"; NodeType[NodeType["IdentifierSelector"] = 15] = "IdentifierSelector"; NodeType[NodeType["ElementNameSelector"] = 16] = "ElementNameSelector"; NodeType[NodeType["PseudoSelector"] = 17] = "PseudoSelector"; NodeType[NodeType["AttributeSelector"] = 18] = "AttributeSelector"; NodeType[NodeType["Declaration"] = 19] = "Declaration"; NodeType[NodeType["Declarations"] = 20] = "Declarations"; NodeType[NodeType["Property"] = 21] = "Property"; NodeType[NodeType["Expression"] = 22] = "Expression"; NodeType[NodeType["BinaryExpression"] = 23] = "BinaryExpression"; NodeType[NodeType["Term"] = 24] = "Term"; NodeType[NodeType["Operator"] = 25] = "Operator"; NodeType[NodeType["Value"] = 26] = "Value"; NodeType[NodeType["StringLiteral"] = 27] = "StringLiteral"; NodeType[NodeType["URILiteral"] = 28] = "URILiteral"; NodeType[NodeType["EscapedValue"] = 29] = "EscapedValue"; NodeType[NodeType["Function"] = 30] = "Function"; NodeType[NodeType["NumericValue"] = 31] = "NumericValue"; NodeType[NodeType["HexColorValue"] = 32] = "HexColorValue"; NodeType[NodeType["RatioValue"] = 33] = "RatioValue"; NodeType[NodeType["MixinDeclaration"] = 34] = "MixinDeclaration"; NodeType[NodeType["MixinReference"] = 35] = "MixinReference"; NodeType[NodeType["VariableName"] = 36] = "VariableName"; NodeType[NodeType["VariableDeclaration"] = 37] = "VariableDeclaration"; NodeType[NodeType["Prio"] = 38] = "Prio"; NodeType[NodeType["Interpolation"] = 39] = "Interpolation"; NodeType[NodeType["NestedProperties"] = 40] = "NestedProperties"; NodeType[NodeType["ExtendsReference"] = 41] = "ExtendsReference"; NodeType[NodeType["SelectorPlaceholder"] = 42] = "SelectorPlaceholder"; NodeType[NodeType["Debug"] = 43] = "Debug"; NodeType[NodeType["If"] = 44] = "If"; NodeType[NodeType["Else"] = 45] = "Else"; NodeType[NodeType["For"] = 46] = "For"; NodeType[NodeType["Each"] = 47] = "Each"; NodeType[NodeType["While"] = 48] = "While"; NodeType[NodeType["MixinContentReference"] = 49] = "MixinContentReference"; NodeType[NodeType["MixinContentDeclaration"] = 50] = "MixinContentDeclaration"; NodeType[NodeType["Media"] = 51] = "Media"; NodeType[NodeType["Keyframe"] = 52] = "Keyframe"; NodeType[NodeType["FontFace"] = 53] = "FontFace"; NodeType[NodeType["Import"] = 54] = "Import"; NodeType[NodeType["Namespace"] = 55] = "Namespace"; NodeType[NodeType["Invocation"] = 56] = "Invocation"; NodeType[NodeType["FunctionDeclaration"] = 57] = "FunctionDeclaration"; NodeType[NodeType["ReturnStatement"] = 58] = "ReturnStatement"; NodeType[NodeType["MediaQuery"] = 59] = "MediaQuery"; NodeType[NodeType["MediaCondition"] = 60] = "MediaCondition"; NodeType[NodeType["MediaFeature"] = 61] = "MediaFeature"; NodeType[NodeType["FunctionParameter"] = 62] = "FunctionParameter"; NodeType[NodeType["FunctionArgument"] = 63] = "FunctionArgument"; NodeType[NodeType["KeyframeSelector"] = 64] = "KeyframeSelector"; NodeType[NodeType["ViewPort"] = 65] = "ViewPort"; NodeType[NodeType["Document"] = 66] = "Document"; NodeType[NodeType["AtApplyRule"] = 67] = "AtApplyRule"; NodeType[NodeType["CustomPropertyDeclaration"] = 68] = "CustomPropertyDeclaration"; NodeType[NodeType["CustomPropertySet"] = 69] = "CustomPropertySet"; NodeType[NodeType["ListEntry"] = 70] = "ListEntry"; NodeType[NodeType["Supports"] = 71] = "Supports"; NodeType[NodeType["SupportsCondition"] = 72] = "SupportsCondition"; NodeType[NodeType["NamespacePrefix"] = 73] = "NamespacePrefix"; NodeType[NodeType["GridLine"] = 74] = "GridLine"; NodeType[NodeType["Plugin"] = 75] = "Plugin"; NodeType[NodeType["UnknownAtRule"] = 76] = "UnknownAtRule"; NodeType[NodeType["Use"] = 77] = "Use"; NodeType[NodeType["ModuleConfiguration"] = 78] = "ModuleConfiguration"; NodeType[NodeType["Forward"] = 79] = "Forward"; NodeType[NodeType["ForwardVisibility"] = 80] = "ForwardVisibility"; NodeType[NodeType["Module"] = 81] = "Module"; NodeType[NodeType["UnicodeRange"] = 82] = "UnicodeRange"; NodeType[NodeType["Layer"] = 83] = "Layer"; NodeType[NodeType["LayerNameList"] = 84] = "LayerNameList"; NodeType[NodeType["LayerName"] = 85] = "LayerName"; NodeType[NodeType["PropertyAtRule"] = 86] = "PropertyAtRule"; })(NodeType = exports.NodeType || (exports.NodeType = {})); var ReferenceType; (function (ReferenceType) { ReferenceType[ReferenceType["Mixin"] = 0] = "Mixin"; ReferenceType[ReferenceType["Rule"] = 1] = "Rule"; ReferenceType[ReferenceType["Variable"] = 2] = "Variable"; ReferenceType[ReferenceType["Function"] = 3] = "Function"; ReferenceType[ReferenceType["Keyframe"] = 4] = "Keyframe"; ReferenceType[ReferenceType["Unknown"] = 5] = "Unknown"; ReferenceType[ReferenceType["Module"] = 6] = "Module"; ReferenceType[ReferenceType["Forward"] = 7] = "Forward"; ReferenceType[ReferenceType["ForwardVisibility"] = 8] = "ForwardVisibility"; ReferenceType[ReferenceType["Property"] = 9] = "Property"; })(ReferenceType = exports.ReferenceType || (exports.ReferenceType = {})); function getNodeAtOffset(node, offset) { let candidate = null; if (!node || offset < node.offset || offset > node.end) { return null; } // Find the shortest node at the position node.accept((node) => { if (node.offset === -1 && node.length === -1) { return true; } if (node.offset <= offset && node.end >= offset) { if (!candidate) { candidate = node; } else if (node.length <= candidate.length) { candidate = node; } return true; } return false; }); return candidate; } exports.getNodeAtOffset = getNodeAtOffset; function getNodePath(node, offset) { let candidate = getNodeAtOffset(node, offset); const path = []; while (candidate) { path.unshift(candidate); candidate = candidate.parent; } return path; } exports.getNodePath = getNodePath; function getParentDeclaration(node) { const decl = node.findParent(NodeType.Declaration); const value = decl && decl.getValue(); if (value && value.encloses(node)) { return decl; } return null; } exports.getParentDeclaration = getParentDeclaration; class Node { get end() { return this.offset + this.length; } constructor(offset = -1, len = -1, nodeType) { this.parent = null; this.offset = offset; this.length = len; if (nodeType) { this.nodeType = nodeType; } } set type(type) { this.nodeType = type; } get type() { return this.nodeType || NodeType.Undefined; } getTextProvider() { let node = this; while (node && !node.textProvider) { node = node.parent; } if (node) { return node.textProvider; } return () => { return 'unknown'; }; } getText() { return this.getTextProvider()(this.offset, this.length); } matches(str) { return this.length === str.length && this.getTextProvider()(this.offset, this.length) === str; } startsWith(str) { return this.length >= str.length && this.getTextProvider()(this.offset, str.length) === str; } endsWith(str) { return this.length >= str.length && this.getTextProvider()(this.end - str.length, str.length) === str; } accept(visitor) { if (visitor(this) && this.children) { for (const child of this.children) { child.accept(visitor); } } } acceptVisitor(visitor) { this.accept(visitor.visitNode.bind(visitor)); } adoptChild(node, index = -1) { if (node.parent && node.parent.children) { const idx = node.parent.children.indexOf(node); if (idx >= 0) { node.parent.children.splice(idx, 1); } } node.parent = this; let children = this.children; if (!children) { children = this.children = []; } if (index !== -1) { children.splice(index, 0, node); } else { children.push(node); } return node; } attachTo(parent, index = -1) { if (parent) { parent.adoptChild(this, index); } return this; } collectIssues(results) { if (this.issues) { results.push.apply(results, this.issues); } } addIssue(issue) { if (!this.issues) { this.issues = []; } this.issues.push(issue); } hasIssue(rule) { return Array.isArray(this.issues) && this.issues.some(i => i.getRule() === rule); } isErroneous(recursive = false) { if (this.issues && this.issues.length > 0) { return true; } return recursive && Array.isArray(this.children) && this.children.some(c => c.isErroneous(true)); } setNode(field, node, index = -1) { if (node) { node.attachTo(this, index); this[field] = node; return true; } return false; } addChild(node) { if (node) { if (!this.children) { this.children = []; } node.attachTo(this); this.updateOffsetAndLength(node); return true; } return false; } updateOffsetAndLength(node) { if (node.offset < this.offset || this.offset === -1) { this.offset = node.offset; } const nodeEnd = node.end; if ((nodeEnd > this.end) || this.length === -1) { this.length = nodeEnd - this.offset; } } hasChildren() { return !!this.children && this.children.length > 0; } getChildren() { return this.children ? this.children.slice(0) : []; } getChild(index) { if (this.children && index < this.children.length) { return this.children[index]; } return null; } addChildren(nodes) { for (const node of nodes) { this.addChild(node); } } findFirstChildBeforeOffset(offset) { if (this.children) { let current = null; for (let i = this.children.length - 1; i >= 0; i--) { // iterate until we find a child that has a start offset smaller than the input offset current = this.children[i]; if (current.offset <= offset) { return current; } } } return null; } findChildAtOffset(offset, goDeep) { const current = this.findFirstChildBeforeOffset(offset); if (current && current.end >= offset) { if (goDeep) { return current.findChildAtOffset(offset, true) || current; } return current; } return null; } encloses(candidate) { return this.offset <= candidate.offset && this.offset + this.length >= candidate.offset + candidate.length; } getParent() { let result = this.parent; while (result instanceof Nodelist) { result = result.parent; } return result; } findParent(type) { let result = this; while (result && result.type !== type) { result = result.parent; } return result; } findAParent(...types) { let result = this; while (result && !types.some(t => result.type === t)) { result = result.parent; } return result; } setData(key, value) { if (!this.options) { this.options = {}; } this.options[key] = value; } getData(key) { if (!this.options || !this.options.hasOwnProperty(key)) { return null; } return this.options[key]; } } exports.Node = Node; class Nodelist extends Node { constructor(parent, index = -1) { super(-1, -1); this.attachTo(parent, index); this.offset = -1; this.length = -1; } } exports.Nodelist = Nodelist; class UnicodeRange extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.UnicodeRange; } setRangeStart(rangeStart) { return this.setNode('rangeStart', rangeStart); } getRangeStart() { return this.rangeStart; } setRangeEnd(rangeEnd) { return this.setNode('rangeEnd', rangeEnd); } getRangeEnd() { return this.rangeEnd; } } exports.UnicodeRange = UnicodeRange; class Identifier extends Node { constructor(offset, length) { super(offset, length); this.isCustomProperty = false; } get type() { return NodeType.Identifier; } containsInterpolation() { return this.hasChildren(); } } exports.Identifier = Identifier; class Stylesheet extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.Stylesheet; } } exports.Stylesheet = Stylesheet; class Declarations extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.Declarations; } } exports.Declarations = Declarations; class BodyDeclaration extends Node { constructor(offset, length) { super(offset, length); } getDeclarations() { return this.declarations; } setDeclarations(decls) { return this.setNode('declarations', decls); } } exports.BodyDeclaration = BodyDeclaration; class RuleSet extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.Ruleset; } getSelectors() { if (!this.selectors) { this.selectors = new Nodelist(this); } return this.selectors; } isNested() { return !!this.parent && this.parent.findParent(NodeType.Declarations) !== null; } } exports.RuleSet = RuleSet; class Selector extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.Selector; } } exports.Selector = Selector; class SimpleSelector extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.SimpleSelector; } } exports.SimpleSelector = SimpleSelector; class AtApplyRule extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.AtApplyRule; } setIdentifier(node) { return this.setNode('identifier', node, 0); } getIdentifier() { return this.identifier; } getName() { return this.identifier ? this.identifier.getText() : ''; } } exports.AtApplyRule = AtApplyRule; class AbstractDeclaration extends Node { constructor(offset, length) { super(offset, length); } } exports.AbstractDeclaration = AbstractDeclaration; class CustomPropertySet extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.CustomPropertySet; } } exports.CustomPropertySet = CustomPropertySet; class Declaration extends AbstractDeclaration { constructor(offset, length) { super(offset, length); this.property = null; } get type() { return NodeType.Declaration; } setProperty(node) { return this.setNode('property', node); } getProperty() { return this.property; } getFullPropertyName() { const propertyName = this.property ? this.property.getName() : 'unknown'; if (this.parent instanceof Declarations && this.parent.getParent() instanceof NestedProperties) { const parentDecl = this.parent.getParent().getParent(); if (parentDecl instanceof Declaration) { return parentDecl.getFullPropertyName() + propertyName; } } return propertyName; } getNonPrefixedPropertyName() { const propertyName = this.getFullPropertyName(); if (propertyName && propertyName.charAt(0) === '-') { const vendorPrefixEnd = propertyName.indexOf('-', 1); if (vendorPrefixEnd !== -1) { return propertyName.substring(vendorPrefixEnd + 1); } } return propertyName; } setValue(value) { return this.setNode('value', value); } getValue() { return this.value; } setNestedProperties(value) { return this.setNode('nestedProperties', value); } getNestedProperties() { return this.nestedProperties; } } exports.Declaration = Declaration; class CustomPropertyDeclaration extends Declaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.CustomPropertyDeclaration; } setPropertySet(value) { return this.setNode('propertySet', value); } getPropertySet() { return this.propertySet; } } exports.CustomPropertyDeclaration = CustomPropertyDeclaration; class Property extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.Property; } setIdentifier(value) { return this.setNode('identifier', value); } getIdentifier() { return this.identifier; } getName() { return (0, strings_1.trim)(this.getText(), /[_\+]+$/); /* +_: less merge */ } isCustomProperty() { return !!this.identifier && this.identifier.isCustomProperty; } } exports.Property = Property; class Invocation extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.Invocation; } getArguments() { if (!this.arguments) { this.arguments = new Nodelist(this); } return this.arguments; } } exports.Invocation = Invocation; class Function extends Invocation { constructor(offset, length) { super(offset, length); } get type() { return NodeType.Function; } setIdentifier(node) { return this.setNode('identifier', node, 0); } getIdentifier() { return this.identifier; } getName() { return this.identifier ? this.identifier.getText() : ''; } } exports.Function = Function; class FunctionParameter extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.FunctionParameter; } setIdentifier(node) { return this.setNode('identifier', node, 0); } getIdentifier() { return this.identifier; } getName() { return this.identifier ? this.identifier.getText() : ''; } setDefaultValue(node) { return this.setNode('defaultValue', node, 0); } getDefaultValue() { return this.defaultValue; } } exports.FunctionParameter = FunctionParameter; class FunctionArgument extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.FunctionArgument; } setIdentifier(node) { return this.setNode('identifier', node, 0); } getIdentifier() { return this.identifier; } getName() { return this.identifier ? this.identifier.getText() : ''; } setValue(node) { return this.setNode('value', node, 0); } getValue() { return this.value; } } exports.FunctionArgument = FunctionArgument; class IfStatement extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.If; } setExpression(node) { return this.setNode('expression', node, 0); } setElseClause(elseClause) { return this.setNode('elseClause', elseClause); } } exports.IfStatement = IfStatement; class ForStatement extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.For; } setVariable(node) { return this.setNode('variable', node, 0); } } exports.ForStatement = ForStatement; class EachStatement extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.Each; } getVariables() { if (!this.variables) { this.variables = new Nodelist(this); } return this.variables; } } exports.EachStatement = EachStatement; class WhileStatement extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.While; } } exports.WhileStatement = WhileStatement; class ElseStatement extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.Else; } } exports.ElseStatement = ElseStatement; class FunctionDeclaration extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.FunctionDeclaration; } setIdentifier(node) { return this.setNode('identifier', node, 0); } getIdentifier() { return this.identifier; } getName() { return this.identifier ? this.identifier.getText() : ''; } getParameters() { if (!this.parameters) { this.parameters = new Nodelist(this); } return this.parameters; } } exports.FunctionDeclaration = FunctionDeclaration; class ViewPort extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.ViewPort; } } exports.ViewPort = ViewPort; class FontFace extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.FontFace; } } exports.FontFace = FontFace; class NestedProperties extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.NestedProperties; } } exports.NestedProperties = NestedProperties; class Keyframe extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.Keyframe; } setKeyword(keyword) { return this.setNode('keyword', keyword, 0); } getKeyword() { return this.keyword; } setIdentifier(node) { return this.setNode('identifier', node, 0); } getIdentifier() { return this.identifier; } getName() { return this.identifier ? this.identifier.getText() : ''; } } exports.Keyframe = Keyframe; class KeyframeSelector extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.KeyframeSelector; } } exports.KeyframeSelector = KeyframeSelector; class Import extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.Import; } setMedialist(node) { if (node) { node.attachTo(this); return true; } return false; } } exports.Import = Import; class Use extends Node { get type() { return NodeType.Use; } getParameters() { if (!this.parameters) { this.parameters = new Nodelist(this); } return this.parameters; } setIdentifier(node) { return this.setNode('identifier', node, 0); } getIdentifier() { return this.identifier; } } exports.Use = Use; class ModuleConfiguration extends Node { get type() { return NodeType.ModuleConfiguration; } setIdentifier(node) { return this.setNode('identifier', node, 0); } getIdentifier() { return this.identifier; } getName() { return this.identifier ? this.identifier.getText() : ''; } setValue(node) { return this.setNode('value', node, 0); } getValue() { return this.value; } } exports.ModuleConfiguration = ModuleConfiguration; class Forward extends Node { get type() { return NodeType.Forward; } setIdentifier(node) { return this.setNode('identifier', node, 0); } getIdentifier() { return this.identifier; } getMembers() { if (!this.members) { this.members = new Nodelist(this); } return this.members; } getParameters() { if (!this.parameters) { this.parameters = new Nodelist(this); } return this.parameters; } } exports.Forward = Forward; class ForwardVisibility extends Node { get type() { return NodeType.ForwardVisibility; } setIdentifier(node) { return this.setNode('identifier', node, 0); } getIdentifier() { return this.identifier; } } exports.ForwardVisibility = ForwardVisibility; class Namespace extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.Namespace; } } exports.Namespace = Namespace; class Media extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.Media; } } exports.Media = Media; class Supports extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.Supports; } } exports.Supports = Supports; class Layer extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.Layer; } setNames(names) { return this.setNode('names', names); } getNames() { return this.names; } } exports.Layer = Layer; class PropertyAtRule extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.PropertyAtRule; } setName(node) { if (node) { node.attachTo(this); this.name = node; return true; } return false; } getName() { return this.name; } } exports.PropertyAtRule = PropertyAtRule; class Document extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.Document; } } exports.Document = Document; class Medialist extends Node { constructor(offset, length) { super(offset, length); } } exports.Medialist = Medialist; class MediaQuery extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.MediaQuery; } } exports.MediaQuery = MediaQuery; class MediaCondition extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.MediaCondition; } } exports.MediaCondition = MediaCondition; class MediaFeature extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.MediaFeature; } } exports.MediaFeature = MediaFeature; class SupportsCondition extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.SupportsCondition; } } exports.SupportsCondition = SupportsCondition; class Page extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.Page; } } exports.Page = Page; class PageBoxMarginBox extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.PageBoxMarginBox; } } exports.PageBoxMarginBox = PageBoxMarginBox; class Expression extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.Expression; } } exports.Expression = Expression; class BinaryExpression extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.BinaryExpression; } setLeft(left) { return this.setNode('left', left); } getLeft() { return this.left; } setRight(right) { return this.setNode('right', right); } getRight() { return this.right; } setOperator(value) { return this.setNode('operator', value); } getOperator() { return this.operator; } } exports.BinaryExpression = BinaryExpression; class Term extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.Term; } setOperator(value) { return this.setNode('operator', value); } getOperator() { return this.operator; } setExpression(value) { return this.setNode('expression', value); } getExpression() { return this.expression; } } exports.Term = Term; class AttributeSelector extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.AttributeSelector; } setNamespacePrefix(value) { return this.setNode('namespacePrefix', value); } getNamespacePrefix() { return this.namespacePrefix; } setIdentifier(value) { return this.setNode('identifier', value); } getIdentifier() { return this.identifier; } setOperator(operator) { return this.setNode('operator', operator); } getOperator() { return this.operator; } setValue(value) { return this.setNode('value', value); } getValue() { return this.value; } } exports.AttributeSelector = AttributeSelector; class Operator extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.Operator; } } exports.Operator = Operator; class HexColorValue extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.HexColorValue; } } exports.HexColorValue = HexColorValue; class RatioValue extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.RatioValue; } } exports.RatioValue = RatioValue; const _dot = '.'.charCodeAt(0), _0 = '0'.charCodeAt(0), _9 = '9'.charCodeAt(0); class NumericValue extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.NumericValue; } getValue() { const raw = this.getText(); let unitIdx = 0; let code; for (let i = 0, len = raw.length; i < len; i++) { code = raw.charCodeAt(i); if (!(_0 <= code && code <= _9 || code === _dot)) { break; } unitIdx += 1; } return { value: raw.substring(0, unitIdx), unit: unitIdx < raw.length ? raw.substring(unitIdx) : undefined }; } } exports.NumericValue = NumericValue; class VariableDeclaration extends AbstractDeclaration { constructor(offset, length) { super(offset, length); this.needsSemicolon = true; } get type() { return NodeType.VariableDeclaration; } setVariable(node) { if (node) { node.attachTo(this); this.variable = node; return true; } return false; } getVariable() { return this.variable; } getName() { return this.variable ? this.variable.getName() : ''; } setValue(node) { if (node) { node.attachTo(this); this.value = node; return true; } return false; } getValue() { return this.value; } } exports.VariableDeclaration = VariableDeclaration; class Interpolation extends Node { // private _interpolations: void; // workaround for https://github.com/Microsoft/TypeScript/issues/18276 constructor(offset, length) { super(offset, length); } get type() { return NodeType.Interpolation; } } exports.Interpolation = Interpolation; class Variable extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.VariableName; } getName() { return this.getText(); } } exports.Variable = Variable; class ExtendsReference extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.ExtendsReference; } getSelectors() { if (!this.selectors) { this.selectors = new Nodelist(this); } return this.selectors; } } exports.ExtendsReference = ExtendsReference; class MixinContentReference extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.MixinContentReference; } getArguments() { if (!this.arguments) { this.arguments = new Nodelist(this); } return this.arguments; } } exports.MixinContentReference = MixinContentReference; class MixinContentDeclaration extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.MixinContentDeclaration; } getParameters() { if (!this.parameters) { this.parameters = new Nodelist(this); } return this.parameters; } } exports.MixinContentDeclaration = MixinContentDeclaration; class MixinReference extends Node { constructor(offset, length) { super(offset, length); } get type() { return NodeType.MixinReference; } getNamespaces() { if (!this.namespaces) { this.namespaces = new Nodelist(this); } return this.namespaces; } setIdentifier(node) { return this.setNode('identifier', node, 0); } getIdentifier() { return this.identifier; } getName() { return this.identifier ? this.identifier.getText() : ''; } getArguments() { if (!this.arguments) { this.arguments = new Nodelist(this); } return this.arguments; } setContent(node) { return this.setNode('content', node); } getContent() { return this.content; } } exports.MixinReference = MixinReference; class MixinDeclaration extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.MixinDeclaration; } setIdentifier(node) { return this.setNode('identifier', node, 0); } getIdentifier() { return this.identifier; } getName() { return this.identifier ? this.identifier.getText() : ''; } getParameters() { if (!this.parameters) { this.parameters = new Nodelist(this); } return this.parameters; } setGuard(node) { if (node) { node.attachTo(this); this.guard = node; } return false; } } exports.MixinDeclaration = MixinDeclaration; class UnknownAtRule extends BodyDeclaration { constructor(offset, length) { super(offset, length); } get type() { return NodeType.UnknownAtRule; } setAtRuleName(atRuleName) { this.atRuleName = atRuleName; } getAtRuleName() { return this.atRuleName; } } exports.UnknownAtRule = UnknownAtRule; class ListEntry extends Node { get type() { return NodeType.ListEntry; } setKey(node) { return this.setNode('key', node, 0); } setValue(node) { return this.setNode('value', node, 1); } } exports.ListEntry = ListEntry; class LessGuard extends Node { getConditions() { if (!this.conditions) { this.conditions = new Nodelist(this); } return this.conditions; } } exports.LessGuard = LessGuard; class GuardCondition extends Node { setVariable(node) { return this.setNode('variable', node); } } exports.GuardCondition = GuardCondition; class Module extends Node { get type() { return NodeType.Module; } setIdentifier(node) { return this.setNode('identifier', node, 0); } getIdentifier() { return this.identifier; } } exports.Module = Module; var Level; (function (Level) { Level[Level["Ignore"] = 1] = "Ignore"; Level[Level["Warning"] = 2] = "Warning"; Level[Level["Error"] = 4] = "Error"; })(Level = exports.Level || (exports.Level = {})); class Marker { constructor(node, rule, level, message, offset = node.offset, length = node.length) { this.node = node; this.rule = rule; this.level = level; this.message = message || rule.message; this.offset = offset; this.length = length; } getRule() { return this.rule; } getLevel() { return this.level; } getOffset() { return this.offset; } getLength() { return this.length; } getNode() { return this.node; } getMessage() { return this.message; } } exports.Marker = Marker; /* export class DefaultVisitor implements IVisitor { public visitNode(node:Node):boolean { switch (node.type) { case NodeType.Stylesheet: return this.visitStylesheet( node); case NodeType.FontFace: return this.visitFontFace( node); case NodeType.Ruleset: return this.visitRuleSet( node); case NodeType.Selector: return this.visitSelector( node); case NodeType.SimpleSelector: return this.visitSimpleSelector( node); case NodeType.Declaration: return this.visitDeclaration( node); case NodeType.Function: return this.visitFunction( node); case NodeType.FunctionDeclaration: return this.visitFunctionDeclaration( node); case NodeType.FunctionParameter: return this.visitFunctionParameter( node); case NodeType.FunctionArgument: return this.visitFunctionArgument( node); case NodeType.Term: return this.visitTerm( node); case NodeType.Declaration: return this.visitExpression( node); case NodeType.NumericValue: return this.visitNumericValue( node); case NodeType.Page: return this.visitPage( node); case NodeType.PageBoxMarginBox: return this.visitPageBoxMarginBox( node); case NodeType.Property: return this.visitProperty( node); case NodeType.NumericValue: return this.visitNodelist( node); case NodeType.Import: return this.visitImport( node); case NodeType.Namespace: return this.visitNamespace( node); case NodeType.Keyframe: return this.visitKeyframe( node); case NodeType.KeyframeSelector: return this.visitKeyframeSelector( node); case NodeType.MixinDeclaration: return this.visitMixinDeclaration( node); case NodeType.MixinReference: return this.visitMixinReference( node); case NodeType.Variable: return this.visitVariable( node); case NodeType.VariableDeclaration: return this.visitVariableDeclaration( node); } return this.visitUnknownNode(node); } public visitFontFace(node:FontFace):boolean { return true; } public visitKeyframe(node:Keyframe):boolean { return true; } public visitKeyframeSelector(node:KeyframeSelector):boolean { return true; } public visitStylesheet(node:Stylesheet):boolean { return true; } public visitProperty(Node:Property):boolean { return true; } public visitRuleSet(node:RuleSet):boolean { return true; } public visitSelector(node:Selector):boolean { return true; } public visitSimpleSelector(node:SimpleSelector):boolean { return true; } public visitDeclaration(node:Declaration):boolean { return true; } public visitFunction(node:Function):boolean { return true; } public visitFunctionDeclaration(node:FunctionDeclaration):boolean { return true; } public visitInvocation(node:Invocation):boolean { return true; } public visitTerm(node:Term):boolean { return true; } public visitImport(node:Import):boolean { return true; } public visitNamespace(node:Namespace):boolean { return true; } public visitExpression(node:Expression):boolean { return true; } public visitNumericValue(node:NumericValue):boolean { return true; } public visitPage(node:Page):boolean { return true; } public visitPageBoxMarginBox(node:PageBoxMarginBox):boolean { return true; } public visitNodelist(node:Nodelist):boolean { return true; } public visitVariableDeclaration(node:VariableDeclaration):boolean { return true; } public visitVariable(node:Variable):boolean { return true; } public visitMixinDeclaration(node:MixinDeclaration):boolean { return true; } public visitMixinReference(node:MixinReference):boolean { return true; } public visitUnknownNode(node:Node):boolean { return true; } } */ class ParseErrorCollector { static entries(node) { const visitor = new ParseErrorCollector(); node.acceptVisitor(visitor); return visitor.entries; } constructor() { this.entries = []; } visitNode(node) { if (node.isErroneous()) { node.collectIssues(this.entries); } return true; } } exports.ParseErrorCollector = ParseErrorCollector; });