Compare commits
1 Commits
v0.9.1
...
achalmers/
Author | SHA1 | Date | |
---|---|---|---|
534d5431d4 |
15
README.md
15
README.md
@ -123,24 +123,13 @@ Before you submit a contribution PR to this repo, please ensure that:
|
||||
|
||||
## 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
|
||||
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
|
||||
|
||||
```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
|
||||
The PR may serve as a place to discuss the human-readable changelog and extra QA.
|
||||
|
||||
2. Merge the PR
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "untitled-app",
|
||||
"version": "0.9.1",
|
||||
"version": "0.9.0",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@codemirror/autocomplete": "^6.9.0",
|
||||
@ -27,7 +27,6 @@
|
||||
"@uiw/react-codemirror": "^4.21.13",
|
||||
"@xstate/react": "^3.2.2",
|
||||
"crypto-js": "^4.1.1",
|
||||
"debounce-promise": "^3.1.2",
|
||||
"formik": "^2.4.3",
|
||||
"fuse.js": "^6.6.2",
|
||||
"http-server": "^14.1.1",
|
||||
@ -103,7 +102,6 @@
|
||||
"@tauri-apps/cli": "^1.3.1",
|
||||
"@types/crypto-js": "^4.1.1",
|
||||
"@types/debounce": "^1.2.1",
|
||||
"@types/debounce-promise": "^3.1.6",
|
||||
"@types/isomorphic-fetch": "^0.0.36",
|
||||
"@types/react-modal": "^3.16.0",
|
||||
"@types/uuid": "^9.0.1",
|
||||
|
51
src-tauri/Cargo.lock
generated
51
src-tauri/Cargo.lock
generated
@ -155,20 +155,6 @@ version = "0.21.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
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]]
|
||||
name = "bincode"
|
||||
version = "1.3.3"
|
||||
@ -1644,14 +1630,13 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kittycad"
|
||||
version = "0.2.26"
|
||||
version = "0.2.25"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e2623ee601ce203476229df3f9d3a14664cb43e3f7455e9ac8ed91aacaa6163d"
|
||||
checksum = "d9cf962b1e81a0b4eb923a727e761b40672cbacc7f5f0b75e13579d346352bc7"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
"base64 0.21.2",
|
||||
"bigdecimal",
|
||||
"bytes",
|
||||
"chrono",
|
||||
"data-encoding",
|
||||
@ -1703,12 +1688,6 @@ version = "0.2.148"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b"
|
||||
|
||||
[[package]]
|
||||
name = "libm"
|
||||
version = "0.2.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4"
|
||||
|
||||
[[package]]
|
||||
name = "line-wrap"
|
||||
version = "0.1.1"
|
||||
@ -1980,17 +1959,6 @@ dependencies = [
|
||||
"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]]
|
||||
name = "num-integer"
|
||||
version = "0.1.45"
|
||||
@ -2014,9 +1982,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "num-traits"
|
||||
version = "0.2.16"
|
||||
version = "0.2.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2"
|
||||
checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
]
|
||||
@ -3054,11 +3022,10 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "schemars"
|
||||
version = "0.8.15"
|
||||
version = "0.8.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1f7b0ce13155372a76ee2e1c5ffba1fe61ede73fbea5630d61eee6fac4929c0c"
|
||||
checksum = "763f8cd0d4c71ed8389c90cb8100cba87e763bd01a8e614d4f0af97bcd50a161"
|
||||
dependencies = [
|
||||
"bigdecimal",
|
||||
"bytes",
|
||||
"chrono",
|
||||
"dyn-clone",
|
||||
@ -3071,9 +3038,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "schemars_derive"
|
||||
version = "0.8.15"
|
||||
version = "0.8.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e85e2a16b12bdb763244c69ab79363d71db2b4b918a2def53f80b02e0574b13c"
|
||||
checksum = "ec0f696e21e10fa546b7ffb1c9672c6de8fbc7a81acf59524386d8639bf12737"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@ -3775,7 +3742,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "tauri-plugin-fs-extra"
|
||||
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 = [
|
||||
"log",
|
||||
"serde",
|
||||
|
@ -16,7 +16,7 @@ tauri-build = { version = "1.4.0", features = [] }
|
||||
|
||||
[dependencies]
|
||||
anyhow = "1"
|
||||
kittycad = "0.2.26"
|
||||
kittycad = "0.2.25"
|
||||
oauth2 = "4.4.2"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
serde_json = "1.0"
|
||||
|
@ -8,7 +8,7 @@
|
||||
},
|
||||
"package": {
|
||||
"productName": "kittycad-modeling",
|
||||
"version": "0.9.1"
|
||||
"version": "0.9.0"
|
||||
},
|
||||
"tauri": {
|
||||
"allowlist": {
|
||||
|
@ -13,7 +13,6 @@ import {
|
||||
CompletionItemKind,
|
||||
CompletionTriggerKind,
|
||||
} from 'vscode-languageserver-protocol'
|
||||
import debounce from 'debounce-promise'
|
||||
|
||||
import type {
|
||||
Completion,
|
||||
@ -54,11 +53,14 @@ export class LanguageServerPlugin implements PluginValue {
|
||||
private languageId: string
|
||||
private documentVersion: number
|
||||
|
||||
private changesTimeout: number
|
||||
|
||||
constructor(private view: EditorView, private allowHTMLContent: boolean) {
|
||||
this.client = this.view.state.facet(client)
|
||||
this.documentUri = this.view.state.facet(documentUri)
|
||||
this.languageId = this.view.state.facet(languageId)
|
||||
this.documentVersion = 0
|
||||
this.changesTimeout = 0
|
||||
|
||||
this.client.attachPlugin(this)
|
||||
|
||||
@ -69,10 +71,12 @@ export class LanguageServerPlugin implements PluginValue {
|
||||
|
||||
update({ docChanged }: ViewUpdate) {
|
||||
if (!docChanged) return
|
||||
|
||||
this.sendChange({
|
||||
documentText: this.view.state.doc.toString(),
|
||||
})
|
||||
if (this.changesTimeout) clearTimeout(this.changesTimeout)
|
||||
this.changesTimeout = window.setTimeout(() => {
|
||||
this.sendChange({
|
||||
documentText: this.view.state.doc.toString(),
|
||||
})
|
||||
}, changesDelay)
|
||||
}
|
||||
|
||||
destroy() {
|
||||
@ -95,34 +99,14 @@ export class LanguageServerPlugin implements PluginValue {
|
||||
|
||||
async sendChange({ documentText }: { documentText: string }) {
|
||||
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 {
|
||||
debounce(
|
||||
() => {
|
||||
return this.client.textDocumentDidChange({
|
||||
textDocument: {
|
||||
uri: this.documentUri,
|
||||
version: this.documentVersion++,
|
||||
},
|
||||
contentChanges: [{ text: documentText }],
|
||||
})
|
||||
await this.client.textDocumentDidChange({
|
||||
textDocument: {
|
||||
uri: this.documentUri,
|
||||
version: this.documentVersion++,
|
||||
},
|
||||
changesDelay,
|
||||
{ leading: true }
|
||||
)
|
||||
contentChanges: [{ text: documentText }],
|
||||
})
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
}
|
||||
|
18
src/wasm-lib/Cargo.lock
generated
18
src/wasm-lib/Cargo.lock
generated
@ -226,6 +226,17 @@ version = "0.21.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
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]]
|
||||
name = "bigdecimal"
|
||||
version = "0.4.1"
|
||||
@ -1419,7 +1430,7 @@ dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
"base64 0.21.4",
|
||||
"bigdecimal",
|
||||
"bigdecimal 0.4.1",
|
||||
"bytes",
|
||||
"chrono",
|
||||
"data-encoding",
|
||||
@ -1719,7 +1730,7 @@ checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
|
||||
[[package]]
|
||||
name = "openapitor"
|
||||
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 = [
|
||||
"Inflector",
|
||||
"anyhow",
|
||||
@ -2452,7 +2463,8 @@ version = "0.8.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1f7b0ce13155372a76ee2e1c5ffba1fe61ede73fbea5630d61eee6fac4929c0c"
|
||||
dependencies = [
|
||||
"bigdecimal",
|
||||
"bigdecimal 0.3.1",
|
||||
"bigdecimal 0.4.1",
|
||||
"bytes",
|
||||
"chrono",
|
||||
"dyn-clone",
|
||||
|
@ -1,11 +1,11 @@
|
||||
use criterion::{criterion_group, criterion_main, 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 big kitt", |b| {
|
||||
c.bench_function("parse_lex_cube", |b| b.iter(|| lex_and_parse(CUBE_PROGRAM)));
|
||||
c.bench_function("parse_lex_big kitt", |b| {
|
||||
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")))
|
||||
});
|
||||
}
|
||||
|
@ -162,63 +162,12 @@ lazy_static! {
|
||||
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 {
|
||||
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_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> {
|
||||
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())
|
||||
}
|
||||
|
||||
fn make_token(token_type: TokenType, value: &str, start: usize) -> Token {
|
||||
fn make_token(token_type: TokenType, value: String, start: usize) -> Token {
|
||||
Token {
|
||||
token_type,
|
||||
value: value.to_string(),
|
||||
start,
|
||||
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) {
|
||||
return Some(make_token(
|
||||
TokenType::String,
|
||||
&match_first(str_from_index, &STRING)?,
|
||||
match_first(str_from_index, &STRING)?,
|
||||
start_index,
|
||||
));
|
||||
}
|
||||
let is_line_comment_bool = is_line_comment(str_from_index);
|
||||
if is_line_comment_bool || is_block_comment(str_from_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 let Some(val) = match_first(str_from_index, &LINECOMMENT) {
|
||||
return Some(make_token(TokenType::LineComment, val, start_index));
|
||||
}
|
||||
if is_paren_end(str_from_index) {
|
||||
return Some(make_token(
|
||||
TokenType::Brace,
|
||||
&match_first(str_from_index, &PARAN_END)?,
|
||||
start_index,
|
||||
));
|
||||
if let Some(val) = match_first(str_from_index, &BLOCKCOMMENT) {
|
||||
return Some(make_token(TokenType::BlockComment, val, start_index));
|
||||
}
|
||||
if is_paren_start(str_from_index) {
|
||||
return Some(make_token(
|
||||
TokenType::Brace,
|
||||
&match_first(str_from_index, &PARAN_START)?,
|
||||
start_index,
|
||||
));
|
||||
if let Some(val) = match_first(str_from_index, &PARAN_END) {
|
||||
return Some(make_token(TokenType::Brace, val, start_index));
|
||||
}
|
||||
if is_block_start(str_from_index) {
|
||||
return Some(make_token(
|
||||
TokenType::Brace,
|
||||
&match_first(str_from_index, &BLOCK_START)?,
|
||||
start_index,
|
||||
));
|
||||
if let Some(val) = match_first(str_from_index, &PARAN_START) {
|
||||
return Some(make_token(TokenType::Brace, val, start_index));
|
||||
}
|
||||
if is_block_end(str_from_index) {
|
||||
return Some(make_token(
|
||||
TokenType::Brace,
|
||||
&match_first(str_from_index, &BLOCK_END)?,
|
||||
start_index,
|
||||
));
|
||||
if let Some(val) = match_first(str_from_index, &BLOCK_START) {
|
||||
return Some(make_token(TokenType::Brace, val, start_index));
|
||||
}
|
||||
if is_array_start(str_from_index) {
|
||||
return Some(make_token(
|
||||
TokenType::Brace,
|
||||
&match_first(str_from_index, &ARRAY_START)?,
|
||||
start_index,
|
||||
));
|
||||
if let Some(val) = match_first(str_from_index, &BLOCK_END) {
|
||||
return Some(make_token(TokenType::Brace, val, start_index));
|
||||
}
|
||||
if is_array_end(str_from_index) {
|
||||
return Some(make_token(
|
||||
TokenType::Brace,
|
||||
&match_first(str_from_index, &ARRAY_END)?,
|
||||
start_index,
|
||||
));
|
||||
if let Some(val) = match_first(str_from_index, &ARRAY_START) {
|
||||
return Some(make_token(TokenType::Brace, val, start_index));
|
||||
}
|
||||
if is_comma(str_from_index) {
|
||||
return Some(make_token(
|
||||
TokenType::Comma,
|
||||
&match_first(str_from_index, &COMMA)?,
|
||||
start_index,
|
||||
));
|
||||
if let Some(val) = match_first(str_from_index, &ARRAY_END) {
|
||||
return Some(make_token(TokenType::Brace, val, start_index));
|
||||
}
|
||||
if is_operator(str_from_index) {
|
||||
return Some(make_token(
|
||||
TokenType::Operator,
|
||||
&match_first(str_from_index, &OPERATOR)?,
|
||||
start_index,
|
||||
));
|
||||
if let Some(val) = match_first(str_from_index, &COMMA) {
|
||||
return Some(make_token(TokenType::Comma, val, start_index));
|
||||
}
|
||||
if is_number(str_from_index) {
|
||||
return Some(make_token(
|
||||
TokenType::Number,
|
||||
&match_first(str_from_index, &NUMBER)?,
|
||||
start_index,
|
||||
));
|
||||
if let Some(val) = match_first(str_from_index, &OPERATOR) {
|
||||
return Some(make_token(TokenType::Operator, val, start_index));
|
||||
}
|
||||
if is_keyword(str_from_index) {
|
||||
return Some(make_token(
|
||||
TokenType::Keyword,
|
||||
&match_first(str_from_index, &KEYWORD)?,
|
||||
start_index,
|
||||
));
|
||||
if let Some(val) = match_first(str_from_index, &NUMBER) {
|
||||
return Some(make_token(TokenType::Number, val, start_index));
|
||||
}
|
||||
if is_word(str_from_index) {
|
||||
return Some(make_token(
|
||||
TokenType::Word,
|
||||
&match_first(str_from_index, &WORD)?,
|
||||
start_index,
|
||||
));
|
||||
if let Some(val) = match_first(str_from_index, &KEYWORD) {
|
||||
return Some(make_token(TokenType::Keyword, val, start_index));
|
||||
}
|
||||
if is_colon(str_from_index) {
|
||||
return Some(make_token(
|
||||
TokenType::Colon,
|
||||
&match_first(str_from_index, &COLON)?,
|
||||
start_index,
|
||||
));
|
||||
if let Some(val) = match_first(str_from_index, &WORD) {
|
||||
return Some(make_token(TokenType::Word, val, start_index));
|
||||
}
|
||||
if is_double_period(str_from_index) {
|
||||
return Some(make_token(
|
||||
TokenType::DoublePeriod,
|
||||
&match_first(str_from_index, &DOUBLE_PERIOD)?,
|
||||
start_index,
|
||||
));
|
||||
if let Some(val) = match_first(str_from_index, &COLON) {
|
||||
return Some(make_token(TokenType::Colon, val, start_index));
|
||||
}
|
||||
if is_period(str_from_index) {
|
||||
return Some(make_token(
|
||||
TokenType::Period,
|
||||
&match_first(str_from_index, &PERIOD)?,
|
||||
start_index,
|
||||
));
|
||||
if let Some(val) = match_first(str_from_index, &DOUBLE_PERIOD) {
|
||||
return Some(make_token(TokenType::DoublePeriod, val, start_index));
|
||||
}
|
||||
if is_whitespace(str_from_index) {
|
||||
return Some(make_token(
|
||||
TokenType::Whitespace,
|
||||
&match_first(str_from_index, &WHITESPACE)?,
|
||||
start_index,
|
||||
));
|
||||
if let Some(val) = match_first(str_from_index, &PERIOD) {
|
||||
return Some(make_token(TokenType::Period, val, start_index));
|
||||
}
|
||||
if let Some(val) = match_first(str_from_index, &WHITESPACE) {
|
||||
return Some(make_token(TokenType::Whitespace, val, start_index));
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
pub fn lexer(s: &str) -> Vec<Token> {
|
||||
let mut current_index = 0;
|
||||
let mut tokens = Vec::new();
|
||||
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;
|
||||
fn recursively_tokenise(s: &[u8], current_index: usize, previous_tokens: Vec<Token>) -> Vec<Token> {
|
||||
if current_index >= s.len() {
|
||||
return previous_tokens;
|
||||
}
|
||||
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)]
|
||||
@ -394,6 +270,47 @@ mod tests {
|
||||
|
||||
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]
|
||||
fn is_number_test() {
|
||||
assert!(is_number("1".as_bytes()));
|
||||
@ -589,7 +506,7 @@ mod tests {
|
||||
#[test]
|
||||
fn make_token_test() {
|
||||
assert_eq!(
|
||||
make_token(TokenType::Keyword, "const", 56),
|
||||
make_token(TokenType::Keyword, "const".to_owned(), 56),
|
||||
Token {
|
||||
token_type: TokenType::Keyword,
|
||||
value: "const".to_string(),
|
||||
|
10
yarn.lock
10
yarn.lock
@ -1883,11 +1883,6 @@
|
||||
resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.1.1.tgz#602859584cecc91894eb23a4892f38cfa927890d"
|
||||
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":
|
||||
version "1.2.1"
|
||||
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"
|
||||
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:
|
||||
version "3.2.7"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
|
||||
|
Reference in New Issue
Block a user