mirror of
https://github.com/haml/haml.git
synced 2022-11-09 12:33:31 -05:00
[Sass] [SCSS] Record the line numbers of nodes.
This commit is contained in:
parent
b6511d3ed1
commit
11bd2274b7
1 changed files with 21 additions and 10 deletions
|
@ -8,6 +8,7 @@ module Sass
|
||||||
class Parser
|
class Parser
|
||||||
def initialize(str)
|
def initialize(str)
|
||||||
@scanner = StringScanner.new(str)
|
@scanner = StringScanner.new(str)
|
||||||
|
@line = 1
|
||||||
end
|
end
|
||||||
|
|
||||||
def parse
|
def parse
|
||||||
|
@ -21,7 +22,7 @@ module Sass
|
||||||
include Sass::SCSS::RX
|
include Sass::SCSS::RX
|
||||||
|
|
||||||
def stylesheet
|
def stylesheet
|
||||||
block_contents(Sass::Tree::RootNode.new(@scanner.string)) {s}
|
block_contents(node(Sass::Tree::RootNode.new(@scanner.string))) {s}
|
||||||
end
|
end
|
||||||
|
|
||||||
def s
|
def s
|
||||||
|
@ -48,7 +49,7 @@ module Sass
|
||||||
# but some (e.g. @page) take selector-like arguments
|
# but some (e.g. @page) take selector-like arguments
|
||||||
expr || selector
|
expr || selector
|
||||||
end
|
end
|
||||||
node = Sass::Tree::DirectiveNode.new("#{name} #{val.strip}")
|
node = node(Sass::Tree::DirectiveNode.new("#{name} #{val.strip}"))
|
||||||
|
|
||||||
@expected = '"{" or ";"'
|
@expected = '"{" or ";"'
|
||||||
if raw '{'
|
if raw '{'
|
||||||
|
@ -61,13 +62,13 @@ module Sass
|
||||||
end
|
end
|
||||||
|
|
||||||
def mixin
|
def mixin
|
||||||
node = Sass::Tree::MixinDefNode.new(tok!(IDENT), [])
|
node = node(Sass::Tree::MixinDefNode.new(tok!(IDENT), []))
|
||||||
ss
|
ss
|
||||||
block(node)
|
block(node)
|
||||||
end
|
end
|
||||||
|
|
||||||
def include
|
def include
|
||||||
node = Sass::Tree::MixinNode.new(tok!(IDENT), [])
|
node = node(Sass::Tree::MixinNode.new(tok!(IDENT), []))
|
||||||
ss
|
ss
|
||||||
node
|
node
|
||||||
end
|
end
|
||||||
|
@ -100,7 +101,7 @@ module Sass
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
block(Sass::Tree::RuleNode.new(rules.strip))
|
block(node(Sass::Tree::RuleNode.new(rules.strip)))
|
||||||
end
|
end
|
||||||
|
|
||||||
def block(node)
|
def block(node)
|
||||||
|
@ -139,12 +140,14 @@ module Sass
|
||||||
# but I'm not sure the gains would be worth the added complexity.
|
# but I'm not sure the gains would be worth the added complexity.
|
||||||
def declaration_or_ruleset
|
def declaration_or_ruleset
|
||||||
pos = @scanner.pos
|
pos = @scanner.pos
|
||||||
|
line = @line
|
||||||
begin
|
begin
|
||||||
decl = declaration
|
decl = declaration
|
||||||
rescue Sass::SyntaxError
|
rescue Sass::SyntaxError
|
||||||
end
|
end
|
||||||
|
|
||||||
return decl if decl && tok?(/[;}]/)
|
return decl if decl && tok?(/[;}]/)
|
||||||
|
@line = line
|
||||||
@scanner.pos = pos
|
@scanner.pos = pos
|
||||||
return ruleset
|
return ruleset
|
||||||
end
|
end
|
||||||
|
@ -264,7 +267,7 @@ module Sass
|
||||||
expr! :expr
|
expr! :expr
|
||||||
prio
|
prio
|
||||||
end
|
end
|
||||||
Sass::Tree::PropNode.new(name, value.strip, :new)
|
node(Sass::Tree::PropNode.new(name, value.strip, :new))
|
||||||
end
|
end
|
||||||
|
|
||||||
def prio
|
def prio
|
||||||
|
@ -316,6 +319,11 @@ module Sass
|
||||||
@str = nil
|
@str = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def node(node)
|
||||||
|
node.line = @line
|
||||||
|
node
|
||||||
|
end
|
||||||
|
|
||||||
EXPR_NAMES = {
|
EXPR_NAMES = {
|
||||||
:medium => "medium (e.g. print, screen)",
|
:medium => "medium (e.g. print, screen)",
|
||||||
:pseudo_expr => "expression (e.g. fr, 2n+1)",
|
:pseudo_expr => "expression (e.g. fr, 2n+1)",
|
||||||
|
@ -347,7 +355,6 @@ module Sass
|
||||||
|
|
||||||
def expected(name)
|
def expected(name)
|
||||||
pos = @scanner.pos
|
pos = @scanner.pos
|
||||||
line = @scanner.string[0...pos].count("\n") + 1
|
|
||||||
|
|
||||||
after = @scanner.string[[pos - 15, 0].max...pos].gsub(/.*\n/m, '')
|
after = @scanner.string[[pos - 15, 0].max...pos].gsub(/.*\n/m, '')
|
||||||
after = "..." + after if pos >= 15
|
after = "..." + after if pos >= 15
|
||||||
|
@ -358,13 +365,17 @@ module Sass
|
||||||
was += "..." if @scanner.rest.size >= 15
|
was += "..." if @scanner.rest.size >= 15
|
||||||
raise Sass::SyntaxError.new(
|
raise Sass::SyntaxError.new(
|
||||||
"Invalid CSS after #{after.inspect}: expected #{expected}, was #{was.inspect}",
|
"Invalid CSS after #{after.inspect}: expected #{expected}, was #{was.inspect}",
|
||||||
:line => line)
|
:line => @line)
|
||||||
end
|
end
|
||||||
|
|
||||||
def tok(rx)
|
def tok(rx)
|
||||||
res = @scanner.scan(rx)
|
res = @scanner.scan(rx)
|
||||||
@expected = nil if res
|
if res
|
||||||
@str << res if res && @str && rx != COMMENT
|
@line += res.count("\n")
|
||||||
|
@expected = nil
|
||||||
|
@str << res if @str && rx != COMMENT
|
||||||
|
end
|
||||||
|
|
||||||
res
|
res
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue