This commit is contained in:
ConnorSkees 2020-05-31 04:52:14 -04:00
commit 25301f8dd1
7 changed files with 110 additions and 9 deletions

91
.github/workflows/tests.yml vendored Normal file
View File

@ -0,0 +1,91 @@
name: CI
on:
push:
branches:
- master
pull_request:
jobs:
tests:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@master
- uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
- name: version info
run: rustc --version; cargo --version;
- name: Run all tests
run: cargo test
fmt:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@master
- uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
- uses: actions-rs/cargo@v1
with:
command: fmt
args: --all -- --check
clippy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@master
- uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
- uses: actions-rs/cargo@v1
with:
command: clippy
args: -- -D warnings
sass-spec:
continue-on-error: true
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@master
- uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
- name: version info
run: rustc --version; cargo --version;
- name: Build binary
run: cargo b --release
- name: Get sass-spec
run: git submodule init && git submodule update
- name: Install whatever Ruby needs
run: |
sudo apt-get install libncurses5-dev libncursesw5-dev
sudo gem install bundler
cd sass-spec && bundler install
- name: Run Sass spec
run: ./sass-spec/sass-spec.rb -c './target/release/grass'

2
.gitignore vendored
View File

@ -4,3 +4,5 @@
Cargo.lock Cargo.lock
coverage coverage
pkg pkg
.idea/
!input.scss

3
input.scss Normal file
View File

@ -0,0 +1,3 @@
body {
background: red;
}

View File

@ -64,9 +64,7 @@ impl Media {
} }
} }
if super_selector.is_empty() { if !super_selector.is_empty() {
body.append(&mut rules);
} else {
body = vec![Spanned { body = vec![Spanned {
node: Stmt::RuleSet(RuleSet { node: Stmt::RuleSet(RuleSet {
selector: super_selector.clone(), selector: super_selector.clone(),
@ -75,8 +73,8 @@ impl Media {
}), }),
span: kind_span, span: kind_span,
}]; }];
body.append(&mut rules);
} }
body.append(&mut rules);
Ok(Media { Ok(Media {
super_selector: Selector::new(), super_selector: Selector::new(),

View File

@ -1,5 +1,5 @@
use std::iter::Iterator;
use std::borrow::Borrow; use std::borrow::Borrow;
use std::iter::Iterator;
use codemap::{Span, Spanned}; use codemap::{Span, Spanned};

View File

@ -324,7 +324,9 @@ impl Value {
format!("{}{}", self.to_css_string(span)?, s), format!("{}{}", self.to_css_string(span)?, s),
QuoteKind::Quoted, QuoteKind::Quoted,
), ),
Self::Null => Value::String(self.to_css_string(span)?.into_owned(), QuoteKind::None), Self::Null => {
Value::String(self.to_css_string(span)?.into_owned(), QuoteKind::None)
}
_ => Value::String( _ => Value::String(
format!( format!(
"{}{}", "{}{}",

View File

@ -431,6 +431,12 @@ fn single_value<I: Iterator<Item = Token>>(
}) })
} }
fn parse_i64(s: String) -> i64 {
s.as_bytes()
.iter()
.fold(0, |total, this| total * 10 + i64::from(this - b'0'))
}
impl Value { impl Value {
pub fn from_tokens<I: Iterator<Item = Token>>( pub fn from_tokens<I: Iterator<Item = Token>>(
toks: &mut PeekMoreIterator<I>, toks: &mut PeekMoreIterator<I>,
@ -735,7 +741,7 @@ impl Value {
let n = if val.dec_len == 0 { let n = if val.dec_len == 0 {
if val.num.len() <= 18 && val.times_ten.is_empty() { if val.num.len() <= 18 && val.times_ten.is_empty() {
let n = Rational64::new_raw(val.num.parse::<i64>().unwrap(), 1); let n = Rational64::new_raw(parse_i64(val.num), 1);
return Some(Ok(IntermediateValue::Value(Value::Dimension( return Some(Ok(IntermediateValue::Value(Value::Dimension(
Number::new_machine(n), Number::new_machine(n),
unit, unit,
@ -745,8 +751,7 @@ impl Value {
BigRational::new_raw(val.num.parse::<BigInt>().unwrap(), BigInt::one()) BigRational::new_raw(val.num.parse::<BigInt>().unwrap(), BigInt::one())
} else { } else {
if val.num.len() <= 18 && val.times_ten.is_empty() { if val.num.len() <= 18 && val.times_ten.is_empty() {
let n = let n = Rational64::new(parse_i64(val.num), pow(10, val.dec_len));
Rational64::new(val.num.parse::<i64>().unwrap(), pow(10, val.dec_len));
return Some(Ok(IntermediateValue::Value(Value::Dimension( return Some(Ok(IntermediateValue::Value(Value::Dimension(
Number::new_machine(n), Number::new_machine(n),
unit, unit,