Compare commits

..

1 Commits

Author SHA1 Message Date
534d5431d4 Only run regex once per token 2023-09-21 16:49:34 -05:00
10 changed files with 143 additions and 286 deletions

View File

@ -123,24 +123,13 @@ Before you submit a contribution PR to this repo, please ensure that:
## Release a new version ## Release a new version
1. Bump the versions in the .json files by creating a `Cut release v{x}.{y}.{z}` PR, committing the changes from 1. Bump the versions in the .json files by creating a `Bump to v{x}.{y}.{z}` PR, committing the changes from
```bash ```bash
VERSION=x.y.z yarn run bump-jsons VERSION=x.y.z yarn run bump-jsons
``` ```
The PR may serve as a place to discuss the human-readable changelog and extra QA. A quick way of getting PR's merged since the last bump is to [use this PR filter](https://github.com/KittyCAD/modeling-app/pulls?q=is%3Apr+sort%3Aupdated-desc+is%3Amerged+), open up the browser console and past in the following The PR may serve as a place to discuss the human-readable changelog and extra QA.
```typescript
console.log(
'- ' +
Array.from(
document.querySelectorAll('[data-hovercard-type="pull_request"]')
).map((a) => `[${a.innerText}](${a.href})`).join(`
- `)
)
```
grab the md list and delete any that are older than the last bump
2. Merge the PR 2. Merge the PR

View File

@ -1,6 +1,6 @@
{ {
"name": "untitled-app", "name": "untitled-app",
"version": "0.9.1", "version": "0.9.0",
"private": true, "private": true,
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "^6.9.0", "@codemirror/autocomplete": "^6.9.0",
@ -27,7 +27,6 @@
"@uiw/react-codemirror": "^4.21.13", "@uiw/react-codemirror": "^4.21.13",
"@xstate/react": "^3.2.2", "@xstate/react": "^3.2.2",
"crypto-js": "^4.1.1", "crypto-js": "^4.1.1",
"debounce-promise": "^3.1.2",
"formik": "^2.4.3", "formik": "^2.4.3",
"fuse.js": "^6.6.2", "fuse.js": "^6.6.2",
"http-server": "^14.1.1", "http-server": "^14.1.1",
@ -103,7 +102,6 @@
"@tauri-apps/cli": "^1.3.1", "@tauri-apps/cli": "^1.3.1",
"@types/crypto-js": "^4.1.1", "@types/crypto-js": "^4.1.1",
"@types/debounce": "^1.2.1", "@types/debounce": "^1.2.1",
"@types/debounce-promise": "^3.1.6",
"@types/isomorphic-fetch": "^0.0.36", "@types/isomorphic-fetch": "^0.0.36",
"@types/react-modal": "^3.16.0", "@types/react-modal": "^3.16.0",
"@types/uuid": "^9.0.1", "@types/uuid": "^9.0.1",

51
src-tauri/Cargo.lock generated
View File

@ -155,20 +155,6 @@ version = "0.21.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d"
[[package]]
name = "bigdecimal"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "454bca3db10617b88b566f205ed190aedb0e0e6dd4cad61d3988a72e8c5594cb"
dependencies = [
"autocfg",
"libm",
"num-bigint",
"num-integer",
"num-traits",
"serde",
]
[[package]] [[package]]
name = "bincode" name = "bincode"
version = "1.3.3" version = "1.3.3"
@ -1644,14 +1630,13 @@ dependencies = [
[[package]] [[package]]
name = "kittycad" name = "kittycad"
version = "0.2.26" version = "0.2.25"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2623ee601ce203476229df3f9d3a14664cb43e3f7455e9ac8ed91aacaa6163d" checksum = "d9cf962b1e81a0b4eb923a727e761b40672cbacc7f5f0b75e13579d346352bc7"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"async-trait", "async-trait",
"base64 0.21.2", "base64 0.21.2",
"bigdecimal",
"bytes", "bytes",
"chrono", "chrono",
"data-encoding", "data-encoding",
@ -1703,12 +1688,6 @@ version = "0.2.148"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b"
[[package]]
name = "libm"
version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4"
[[package]] [[package]]
name = "line-wrap" name = "line-wrap"
version = "0.1.1" version = "0.1.1"
@ -1980,17 +1959,6 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "num-bigint"
version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0"
dependencies = [
"autocfg",
"num-integer",
"num-traits",
]
[[package]] [[package]]
name = "num-integer" name = "num-integer"
version = "0.1.45" version = "0.1.45"
@ -2014,9 +1982,9 @@ dependencies = [
[[package]] [[package]]
name = "num-traits" name = "num-traits"
version = "0.2.16" version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
dependencies = [ dependencies = [
"autocfg", "autocfg",
] ]
@ -3054,11 +3022,10 @@ dependencies = [
[[package]] [[package]]
name = "schemars" name = "schemars"
version = "0.8.15" version = "0.8.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f7b0ce13155372a76ee2e1c5ffba1fe61ede73fbea5630d61eee6fac4929c0c" checksum = "763f8cd0d4c71ed8389c90cb8100cba87e763bd01a8e614d4f0af97bcd50a161"
dependencies = [ dependencies = [
"bigdecimal",
"bytes", "bytes",
"chrono", "chrono",
"dyn-clone", "dyn-clone",
@ -3071,9 +3038,9 @@ dependencies = [
[[package]] [[package]]
name = "schemars_derive" name = "schemars_derive"
version = "0.8.15" version = "0.8.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e85e2a16b12bdb763244c69ab79363d71db2b4b918a2def53f80b02e0574b13c" checksum = "ec0f696e21e10fa546b7ffb1c9672c6de8fbc7a81acf59524386d8639bf12737"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -3775,7 +3742,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-fs-extra" name = "tauri-plugin-fs-extra"
version = "0.0.0" version = "0.0.0"
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#0190f68f1dff80576595a1b79e31338a3e9ebba1" source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#76832e60bfba44c24d6af8a5099be123886ba63d"
dependencies = [ dependencies = [
"log", "log",
"serde", "serde",

View File

@ -16,7 +16,7 @@ tauri-build = { version = "1.4.0", features = [] }
[dependencies] [dependencies]
anyhow = "1" anyhow = "1"
kittycad = "0.2.26" kittycad = "0.2.25"
oauth2 = "4.4.2" oauth2 = "4.4.2"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0" serde_json = "1.0"

View File

@ -8,7 +8,7 @@
}, },
"package": { "package": {
"productName": "kittycad-modeling", "productName": "kittycad-modeling",
"version": "0.9.1" "version": "0.9.0"
}, },
"tauri": { "tauri": {
"allowlist": { "allowlist": {

View File

@ -13,7 +13,6 @@ import {
CompletionItemKind, CompletionItemKind,
CompletionTriggerKind, CompletionTriggerKind,
} from 'vscode-languageserver-protocol' } from 'vscode-languageserver-protocol'
import debounce from 'debounce-promise'
import type { import type {
Completion, Completion,
@ -54,11 +53,14 @@ export class LanguageServerPlugin implements PluginValue {
private languageId: string private languageId: string
private documentVersion: number private documentVersion: number
private changesTimeout: number
constructor(private view: EditorView, private allowHTMLContent: boolean) { constructor(private view: EditorView, private allowHTMLContent: boolean) {
this.client = this.view.state.facet(client) this.client = this.view.state.facet(client)
this.documentUri = this.view.state.facet(documentUri) this.documentUri = this.view.state.facet(documentUri)
this.languageId = this.view.state.facet(languageId) this.languageId = this.view.state.facet(languageId)
this.documentVersion = 0 this.documentVersion = 0
this.changesTimeout = 0
this.client.attachPlugin(this) this.client.attachPlugin(this)
@ -69,10 +71,12 @@ export class LanguageServerPlugin implements PluginValue {
update({ docChanged }: ViewUpdate) { update({ docChanged }: ViewUpdate) {
if (!docChanged) return if (!docChanged) return
if (this.changesTimeout) clearTimeout(this.changesTimeout)
this.sendChange({ this.changesTimeout = window.setTimeout(() => {
documentText: this.view.state.doc.toString(), this.sendChange({
}) documentText: this.view.state.doc.toString(),
})
}, changesDelay)
} }
destroy() { destroy() {
@ -95,34 +99,14 @@ export class LanguageServerPlugin implements PluginValue {
async sendChange({ documentText }: { documentText: string }) { async sendChange({ documentText }: { documentText: string }) {
if (!this.client.ready) return if (!this.client.ready) return
console.log(documentText.length)
if (documentText.length > 5000) {
// Clear out the text it thinks we have, large documents will throw a stack error.
// This is obviously not a good fix but it works for now til we figure
// out the stack limits in wasm and also rewrite the parser.
// Since this is only for hover and completions it will be fine,
// completions will still work for stdlib but hover will not.
// That seems like a fine trade-off for a working editor for the time
// being.
documentText = ''
}
try { try {
debounce( await this.client.textDocumentDidChange({
() => { textDocument: {
return this.client.textDocumentDidChange({ uri: this.documentUri,
textDocument: { version: this.documentVersion++,
uri: this.documentUri,
version: this.documentVersion++,
},
contentChanges: [{ text: documentText }],
})
}, },
changesDelay, contentChanges: [{ text: documentText }],
{ leading: true } })
)
} catch (e) { } catch (e) {
console.error(e) console.error(e)
} }

View File

@ -226,6 +226,17 @@ version = "0.21.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2"
[[package]]
name = "bigdecimal"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a6773ddc0eafc0e509fb60e48dff7f450f8e674a0686ae8605e8d9901bd5eefa"
dependencies = [
"num-bigint",
"num-integer",
"num-traits",
]
[[package]] [[package]]
name = "bigdecimal" name = "bigdecimal"
version = "0.4.1" version = "0.4.1"
@ -1419,7 +1430,7 @@ dependencies = [
"anyhow", "anyhow",
"async-trait", "async-trait",
"base64 0.21.4", "base64 0.21.4",
"bigdecimal", "bigdecimal 0.4.1",
"bytes", "bytes",
"chrono", "chrono",
"data-encoding", "data-encoding",
@ -1719,7 +1730,7 @@ checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
[[package]] [[package]]
name = "openapitor" name = "openapitor"
version = "0.0.9" version = "0.0.9"
source = "git+https://github.com/KittyCAD/kittycad.rs?branch=main#61a16059b3eaf8793a2a2e1edbc0d770f284fea3" source = "git+https://github.com/KittyCAD/kittycad.rs?branch=main#0d121f6881da91b4a30bee18bbfe50e4a2096073"
dependencies = [ dependencies = [
"Inflector", "Inflector",
"anyhow", "anyhow",
@ -2452,7 +2463,8 @@ version = "0.8.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f7b0ce13155372a76ee2e1c5ffba1fe61ede73fbea5630d61eee6fac4929c0c" checksum = "1f7b0ce13155372a76ee2e1c5ffba1fe61ede73fbea5630d61eee6fac4929c0c"
dependencies = [ dependencies = [
"bigdecimal", "bigdecimal 0.3.1",
"bigdecimal 0.4.1",
"bytes", "bytes",
"chrono", "chrono",
"dyn-clone", "dyn-clone",

View File

@ -1,11 +1,11 @@
use criterion::{criterion_group, criterion_main, Criterion}; use criterion::{criterion_group, criterion_main, Criterion};
pub fn criterion_benchmark(c: &mut Criterion) { pub fn criterion_benchmark(c: &mut Criterion) {
c.bench_function("parse + lex cube", |b| b.iter(|| lex_and_parse(CUBE_PROGRAM))); c.bench_function("parse_lex_cube", |b| b.iter(|| lex_and_parse(CUBE_PROGRAM)));
c.bench_function("parse + lex big kitt", |b| { c.bench_function("parse_lex_big kitt", |b| {
b.iter(|| lex_and_parse(include_str!("../../tests/executor/inputs/kittycad_svg.kcl"))) b.iter(|| lex_and_parse(include_str!("../../tests/executor/inputs/kittycad_svg.kcl")))
}); });
c.bench_function("parse + lex pipes_on_pipes", |b| { c.bench_function("parse_lex_pipes_on_pipes", |b| {
b.iter(|| lex_and_parse(include_str!("../../tests/executor/inputs/pipes_on_pipes.kcl"))) b.iter(|| lex_and_parse(include_str!("../../tests/executor/inputs/pipes_on_pipes.kcl")))
}); });
} }

View File

@ -162,63 +162,12 @@ lazy_static! {
static ref BLOCKCOMMENT: Regex = Regex::new(r"^/\*[\s\S]*?\*/").unwrap(); static ref BLOCKCOMMENT: Regex = Regex::new(r"^/\*[\s\S]*?\*/").unwrap();
} }
fn is_number(character: &[u8]) -> bool {
NUMBER.is_match(character)
}
fn is_whitespace(character: &[u8]) -> bool {
WHITESPACE.is_match(character)
}
fn is_word(character: &[u8]) -> bool {
WORD.is_match(character)
}
fn is_keyword(character: &[u8]) -> bool {
KEYWORD.is_match(character)
}
fn is_string(character: &[u8]) -> bool { fn is_string(character: &[u8]) -> bool {
match STRING.find(character) { match STRING.find(character) {
Some(m) => m.start() == 0, Some(m) => m.start() == 0,
None => false, None => false,
} }
} }
fn is_operator(character: &[u8]) -> bool {
OPERATOR.is_match(character)
}
fn is_block_start(character: &[u8]) -> bool {
BLOCK_START.is_match(character)
}
fn is_block_end(character: &[u8]) -> bool {
BLOCK_END.is_match(character)
}
fn is_paren_start(character: &[u8]) -> bool {
PARAN_START.is_match(character)
}
fn is_paren_end(character: &[u8]) -> bool {
PARAN_END.is_match(character)
}
fn is_array_start(character: &[u8]) -> bool {
ARRAY_START.is_match(character)
}
fn is_array_end(character: &[u8]) -> bool {
ARRAY_END.is_match(character)
}
fn is_comma(character: &[u8]) -> bool {
COMMA.is_match(character)
}
fn is_colon(character: &[u8]) -> bool {
COLON.is_match(character)
}
fn is_double_period(character: &[u8]) -> bool {
DOUBLE_PERIOD.is_match(character)
}
fn is_period(character: &[u8]) -> bool {
PERIOD.is_match(character)
}
fn is_line_comment(character: &[u8]) -> bool {
LINECOMMENT.is_match(character)
}
fn is_block_comment(character: &[u8]) -> bool {
BLOCKCOMMENT.is_match(character)
}
fn match_first(s: &[u8], regex: &Regex) -> Option<String> { fn match_first(s: &[u8], regex: &Regex) -> Option<String> {
regex regex
@ -226,12 +175,12 @@ fn match_first(s: &[u8], regex: &Regex) -> Option<String> {
.map(|the_match| String::from_utf8_lossy(the_match.as_bytes()).into()) .map(|the_match| String::from_utf8_lossy(the_match.as_bytes()).into())
} }
fn make_token(token_type: TokenType, value: &str, start: usize) -> Token { fn make_token(token_type: TokenType, value: String, start: usize) -> Token {
Token { Token {
token_type, token_type,
value: value.to_string(),
start,
end: start + value.len(), end: start + value.len(),
value,
start,
} }
} }
@ -239,153 +188,80 @@ fn return_token_at_index(str_from_index: &[u8], start_index: usize) -> Option<To
if is_string(str_from_index) { if is_string(str_from_index) {
return Some(make_token( return Some(make_token(
TokenType::String, TokenType::String,
&match_first(str_from_index, &STRING)?, match_first(str_from_index, &STRING)?,
start_index, start_index,
)); ));
} }
let is_line_comment_bool = is_line_comment(str_from_index); if let Some(val) = match_first(str_from_index, &LINECOMMENT) {
if is_line_comment_bool || is_block_comment(str_from_index) { return Some(make_token(TokenType::LineComment, val, start_index));
return Some(make_token(
if is_line_comment_bool {
TokenType::LineComment
} else {
TokenType::BlockComment
},
&match_first(
str_from_index,
if is_line_comment_bool {
&LINECOMMENT
} else {
&BLOCKCOMMENT
},
)?,
start_index,
));
} }
if is_paren_end(str_from_index) { if let Some(val) = match_first(str_from_index, &BLOCKCOMMENT) {
return Some(make_token( return Some(make_token(TokenType::BlockComment, val, start_index));
TokenType::Brace,
&match_first(str_from_index, &PARAN_END)?,
start_index,
));
} }
if is_paren_start(str_from_index) { if let Some(val) = match_first(str_from_index, &PARAN_END) {
return Some(make_token( return Some(make_token(TokenType::Brace, val, start_index));
TokenType::Brace,
&match_first(str_from_index, &PARAN_START)?,
start_index,
));
} }
if is_block_start(str_from_index) { if let Some(val) = match_first(str_from_index, &PARAN_START) {
return Some(make_token( return Some(make_token(TokenType::Brace, val, start_index));
TokenType::Brace,
&match_first(str_from_index, &BLOCK_START)?,
start_index,
));
} }
if is_block_end(str_from_index) { if let Some(val) = match_first(str_from_index, &BLOCK_START) {
return Some(make_token( return Some(make_token(TokenType::Brace, val, start_index));
TokenType::Brace,
&match_first(str_from_index, &BLOCK_END)?,
start_index,
));
} }
if is_array_start(str_from_index) { if let Some(val) = match_first(str_from_index, &BLOCK_END) {
return Some(make_token( return Some(make_token(TokenType::Brace, val, start_index));
TokenType::Brace,
&match_first(str_from_index, &ARRAY_START)?,
start_index,
));
} }
if is_array_end(str_from_index) { if let Some(val) = match_first(str_from_index, &ARRAY_START) {
return Some(make_token( return Some(make_token(TokenType::Brace, val, start_index));
TokenType::Brace,
&match_first(str_from_index, &ARRAY_END)?,
start_index,
));
} }
if is_comma(str_from_index) { if let Some(val) = match_first(str_from_index, &ARRAY_END) {
return Some(make_token( return Some(make_token(TokenType::Brace, val, start_index));
TokenType::Comma,
&match_first(str_from_index, &COMMA)?,
start_index,
));
} }
if is_operator(str_from_index) { if let Some(val) = match_first(str_from_index, &COMMA) {
return Some(make_token( return Some(make_token(TokenType::Comma, val, start_index));
TokenType::Operator,
&match_first(str_from_index, &OPERATOR)?,
start_index,
));
} }
if is_number(str_from_index) { if let Some(val) = match_first(str_from_index, &OPERATOR) {
return Some(make_token( return Some(make_token(TokenType::Operator, val, start_index));
TokenType::Number,
&match_first(str_from_index, &NUMBER)?,
start_index,
));
} }
if is_keyword(str_from_index) { if let Some(val) = match_first(str_from_index, &NUMBER) {
return Some(make_token( return Some(make_token(TokenType::Number, val, start_index));
TokenType::Keyword,
&match_first(str_from_index, &KEYWORD)?,
start_index,
));
} }
if is_word(str_from_index) { if let Some(val) = match_first(str_from_index, &KEYWORD) {
return Some(make_token( return Some(make_token(TokenType::Keyword, val, start_index));
TokenType::Word,
&match_first(str_from_index, &WORD)?,
start_index,
));
} }
if is_colon(str_from_index) { if let Some(val) = match_first(str_from_index, &WORD) {
return Some(make_token( return Some(make_token(TokenType::Word, val, start_index));
TokenType::Colon,
&match_first(str_from_index, &COLON)?,
start_index,
));
} }
if is_double_period(str_from_index) { if let Some(val) = match_first(str_from_index, &COLON) {
return Some(make_token( return Some(make_token(TokenType::Colon, val, start_index));
TokenType::DoublePeriod,
&match_first(str_from_index, &DOUBLE_PERIOD)?,
start_index,
));
} }
if is_period(str_from_index) { if let Some(val) = match_first(str_from_index, &DOUBLE_PERIOD) {
return Some(make_token( return Some(make_token(TokenType::DoublePeriod, val, start_index));
TokenType::Period,
&match_first(str_from_index, &PERIOD)?,
start_index,
));
} }
if is_whitespace(str_from_index) { if let Some(val) = match_first(str_from_index, &PERIOD) {
return Some(make_token( return Some(make_token(TokenType::Period, val, start_index));
TokenType::Whitespace, }
&match_first(str_from_index, &WHITESPACE)?, if let Some(val) = match_first(str_from_index, &WHITESPACE) {
start_index, return Some(make_token(TokenType::Whitespace, val, start_index));
));
} }
None None
} }
pub fn lexer(s: &str) -> Vec<Token> { fn recursively_tokenise(s: &[u8], current_index: usize, previous_tokens: Vec<Token>) -> Vec<Token> {
let mut current_index = 0; if current_index >= s.len() {
let mut tokens = Vec::new(); return previous_tokens;
let n = s.len();
let b = s.as_bytes();
while current_index < n {
let token = return_token_at_index(&b[current_index..], current_index);
let Some(token) = token else {
current_index += 1;
continue;
};
let token_length = token.value.len();
tokens.push(token);
current_index += token_length;
} }
tokens let token = return_token_at_index(&s[current_index..], current_index);
let Some(token) = token else {
return recursively_tokenise(s, current_index + 1, previous_tokens);
};
let mut new_tokens = previous_tokens;
let token_length = token.value.len();
new_tokens.push(token);
recursively_tokenise(s, current_index + token_length, new_tokens)
}
pub fn lexer(s: &str) -> Vec<Token> {
recursively_tokenise(s.as_bytes(), 0, Vec::new())
} }
#[cfg(test)] #[cfg(test)]
@ -394,6 +270,47 @@ mod tests {
use super::*; use super::*;
fn is_paren_end(character: &[u8]) -> bool {
PARAN_END.is_match(character)
}
fn is_number(character: &[u8]) -> bool {
NUMBER.is_match(character)
}
fn is_whitespace(character: &[u8]) -> bool {
WHITESPACE.is_match(character)
}
fn is_word(character: &[u8]) -> bool {
WORD.is_match(character)
}
fn is_string(character: &[u8]) -> bool {
match STRING.find(character) {
Some(m) => m.start() == 0,
None => false,
}
}
fn is_operator(character: &[u8]) -> bool {
OPERATOR.is_match(character)
}
fn is_block_start(character: &[u8]) -> bool {
BLOCK_START.is_match(character)
}
fn is_block_end(character: &[u8]) -> bool {
BLOCK_END.is_match(character)
}
fn is_paren_start(character: &[u8]) -> bool {
PARAN_START.is_match(character)
}
fn is_comma(character: &[u8]) -> bool {
COMMA.is_match(character)
}
fn is_line_comment(character: &[u8]) -> bool {
LINECOMMENT.is_match(character)
}
fn is_block_comment(character: &[u8]) -> bool {
BLOCKCOMMENT.is_match(character)
}
#[test] #[test]
fn is_number_test() { fn is_number_test() {
assert!(is_number("1".as_bytes())); assert!(is_number("1".as_bytes()));
@ -589,7 +506,7 @@ mod tests {
#[test] #[test]
fn make_token_test() { fn make_token_test() {
assert_eq!( assert_eq!(
make_token(TokenType::Keyword, "const", 56), make_token(TokenType::Keyword, "const".to_owned(), 56),
Token { Token {
token_type: TokenType::Keyword, token_type: TokenType::Keyword,
value: "const".to_string(), value: "const".to_string(),

View File

@ -1883,11 +1883,6 @@
resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.1.1.tgz#602859584cecc91894eb23a4892f38cfa927890d" resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.1.1.tgz#602859584cecc91894eb23a4892f38cfa927890d"
integrity sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA== integrity sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==
"@types/debounce-promise@^3.1.6":
version "3.1.6"
resolved "https://registry.yarnpkg.com/@types/debounce-promise/-/debounce-promise-3.1.6.tgz#873e838574011095ed0debf73eed3538e1261d75"
integrity sha512-DowqK95aku+OxMCeG2EQSeXeGeE8OCwLpMsUfIbP7hMF8Otj8eQXnzpwdtIKV+UqQBtkMcF6vbi4Otbh8P/wmg==
"@types/debounce@^1.2.1": "@types/debounce@^1.2.1":
version "1.2.1" version "1.2.1"
resolved "https://registry.yarnpkg.com/@types/debounce/-/debounce-1.2.1.tgz#79b65710bc8b6d44094d286aecf38e44f9627852" resolved "https://registry.yarnpkg.com/@types/debounce/-/debounce-1.2.1.tgz#79b65710bc8b6d44094d286aecf38e44f9627852"
@ -2811,11 +2806,6 @@ data-uri-to-buffer@^4.0.0:
resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e"
integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==
debounce-promise@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/debounce-promise/-/debounce-promise-3.1.2.tgz#320fb8c7d15a344455cd33cee5ab63530b6dc7c5"
integrity sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==
debug@^3.2.7: debug@^3.2.7:
version "3.2.7" version "3.2.7"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"