summaryrefslogtreecommitdiff
path: root/scss/rule.py
diff options
context:
space:
mode:
authorEevee (Alex Munroe) <eevee.git@veekun.com>2014-12-10 14:06:42 -0800
committerEevee (Alex Munroe) <eevee.git@veekun.com>2014-12-10 14:06:42 -0800
commit77a58288ded8506cf8ca161fa2df5d8bd9876ece (patch)
tree3c600bddfbe6f5fc4def7bb9d5602db876b09ded /scss/rule.py
parentbe4f062b8caafb88299b4047b5944d9f73dc6a3b (diff)
downloadpyscss-77a58288ded8506cf8ca161fa2df5d8bd9876ece.tar.gz
Make line numbers in errors moderately less wrong.
Diffstat (limited to 'scss/rule.py')
-rw-r--r--scss/rule.py24
1 files changed, 17 insertions, 7 deletions
diff --git a/scss/rule.py b/scss/rule.py
index e39e121..712f4ba 100644
--- a/scss/rule.py
+++ b/scss/rule.py
@@ -34,6 +34,7 @@ class SassRule(object):
def __init__(
self, source_file, import_key=None, unparsed_contents=None,
+ num_header_lines=0,
options=None, legacy_compiler_options=None, properties=None,
namespace=None,
lineno=0, extends_selectors=frozenset(),
@@ -48,6 +49,7 @@ class SassRule(object):
self.import_key = import_key
self.lineno = lineno
+ self.num_header_lines = num_header_lines
self.unparsed_contents = unparsed_contents
self.legacy_compiler_options = legacy_compiler_options or {}
self.options = options or {}
@@ -211,6 +213,7 @@ class BlockHeader(object):
@classmethod
def parse(cls, prop, has_contents=False):
+ num_lines = prop.count('\n')
prop = prop.strip()
# Simple pre-processing
@@ -247,25 +250,27 @@ class BlockHeader(object):
directive, argument = prop, None
directive = directive.lower()
- return BlockAtRuleHeader(directive, argument)
+ return BlockAtRuleHeader(directive, argument, num_lines)
elif prop.split(None, 1)[0].endswith(':'):
# Syntax is "<scope>: [prop]" -- if the optional prop exists, it
# becomes the first rule with no suffix
scope, unscoped_value = prop.split(':', 1)
scope = scope.rstrip()
unscoped_value = unscoped_value.lstrip()
- return BlockScopeHeader(scope, unscoped_value)
+ return BlockScopeHeader(scope, unscoped_value, num_lines)
else:
- return BlockSelectorHeader(prop)
+ return BlockSelectorHeader(prop, num_lines)
class BlockAtRuleHeader(BlockHeader):
is_atrule = True
- def __init__(self, directive, argument):
+ def __init__(self, directive, argument, num_lines=0):
self.directive = directive
self.argument = argument
+ self.num_lines = num_lines
+
def __repr__(self):
return "<%s %r %r>" % (type(self).__name__, self.directive, self.argument)
@@ -279,9 +284,11 @@ class BlockAtRuleHeader(BlockHeader):
class BlockSelectorHeader(BlockHeader):
is_selector = True
- def __init__(self, selectors):
+ def __init__(self, selectors, num_lines=0):
self.selectors = tuple(selectors)
+ self.num_lines = num_lines
+
def __repr__(self):
return "<%s %r>" % (type(self).__name__, self.selectors)
@@ -295,7 +302,7 @@ class BlockSelectorHeader(BlockHeader):
class BlockScopeHeader(BlockHeader):
is_scope = True
- def __init__(self, scope, unscoped_value):
+ def __init__(self, scope, unscoped_value, num_lines=0):
self.scope = scope
if unscoped_value:
@@ -303,6 +310,8 @@ class BlockScopeHeader(BlockHeader):
else:
self.unscoped_value = None
+ self.num_lines = num_lines
+
class UnparsedBlock(object):
"""A Sass block whose contents have not yet been parsed.
@@ -329,7 +338,8 @@ class UnparsedBlock(object):
self.header = BlockHeader.parse(prop, has_contents=bool(unparsed_contents))
# Basic properties
- self.lineno = lineno
+ self.lineno = (
+ parent_rule.lineno - parent_rule.num_header_lines + lineno - 1)
self.prop = prop
self.unparsed_contents = unparsed_contents