/*---------------------------------------------------------------------------------------------
*  Copyright (c) Microsoft Corporation. All rights reserved.
*  Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

declare module 'EmmetFlatNode' {
	export interface Node {
		start: number;
		end: number;
		type: string;
		parent: Node | undefined;
		firstChild: Node | undefined;
		nextSibling: Node | undefined;
		previousSibling: Node | undefined;
		children: Node[];
	}

	export interface Token {
		start: number;
		end: number;
		stream: BufferStream;
		toString(): string;
	}

	export interface CssToken extends Token {
		size: number;
		item(number: number): any;
		type: string;
	}

	export interface HtmlToken extends Token {
		value: string;
	}

	export interface Attribute extends Token {
		name: Token;
		value: Token;
	}

	export interface HtmlNode extends Node {
		name: string;
		open: Token | undefined;
		close: Token | undefined;
		parent: HtmlNode | undefined;
		firstChild: HtmlNode | undefined;
		nextSibling: HtmlNode | undefined;
		previousSibling: HtmlNode | undefined;
		children: HtmlNode[];
		attributes: Attribute[];
	}

	export interface CssNode extends Node {
		name: string;
		parent: CssNode | undefined;
		firstChild: CssNode | undefined;
		nextSibling: CssNode | undefined;
		previousSibling: CssNode | undefined;
		children: CssNode[];
	}

	export interface Rule extends CssNode {
		selectorToken: Token;
		contentStartToken: Token;
		contentEndToken: Token;
	}

	export interface Property extends CssNode {
		valueToken: Token;
		separator: string;
		parent: Rule;
		terminatorToken: Token;
		separatorToken: Token;
		value: string;
	}

	export interface Stylesheet extends Node {
		comments: Token[];
	}

	export interface BufferStream {
		peek(): number;
		next(): number;
		backUp(n: number): number;
		current(): string;
		substring(from: number, to: number): string;
		eat(match: any): boolean;
		eatWhile(match: any): boolean;
	}
}
