IncludeCPP 3.7.4__py3-none-any.whl → 3.7.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- includecpp/__init__.py +1 -1
- includecpp/cli/commands.py +82 -63
- includecpp/core/cssl/CSSL_DOCUMENTATION.md +27 -8
- includecpp/core/cssl/cssl_parser.py +65 -7
- includecpp/core/cssl/cssl_runtime.py +58 -6
- includecpp/vscode/cssl/language-configuration.json +1 -4
- includecpp/vscode/cssl/syntaxes/cssl.tmLanguage.json +96 -11
- {includecpp-3.7.4.dist-info → includecpp-3.7.6.dist-info}/METADATA +1 -1
- {includecpp-3.7.4.dist-info → includecpp-3.7.6.dist-info}/RECORD +13 -13
- {includecpp-3.7.4.dist-info → includecpp-3.7.6.dist-info}/WHEEL +0 -0
- {includecpp-3.7.4.dist-info → includecpp-3.7.6.dist-info}/entry_points.txt +0 -0
- {includecpp-3.7.4.dist-info → includecpp-3.7.6.dist-info}/licenses/LICENSE +0 -0
- {includecpp-3.7.4.dist-info → includecpp-3.7.6.dist-info}/top_level.txt +0 -0
includecpp/__init__.py
CHANGED
includecpp/cli/commands.py
CHANGED
|
@@ -7480,13 +7480,12 @@ def cssl_exec(path, code):
|
|
|
7480
7480
|
# Execute
|
|
7481
7481
|
click.secho("--- Output ---", fg='green')
|
|
7482
7482
|
try:
|
|
7483
|
-
result = cssl_lang.
|
|
7483
|
+
result = cssl_lang.run(source)
|
|
7484
7484
|
|
|
7485
7485
|
# Output is already printed to stdout during execution via runtime.output()
|
|
7486
|
-
#
|
|
7487
|
-
|
|
7488
|
-
|
|
7489
|
-
click.echo(f"Result: {result}")
|
|
7486
|
+
# Don't print "Result:" automatically - users should use printl() for output
|
|
7487
|
+
# This prevents unwanted output for function calls like: Function();
|
|
7488
|
+
pass
|
|
7490
7489
|
|
|
7491
7490
|
except Exception as e:
|
|
7492
7491
|
click.secho(f"CSSL Error: {e}", fg='red')
|
|
@@ -7595,75 +7594,95 @@ def cssl_doc(search, list_sections):
|
|
|
7595
7594
|
click.secho("=" * 50, fg='cyan')
|
|
7596
7595
|
click.echo()
|
|
7597
7596
|
|
|
7598
|
-
# Split into
|
|
7599
|
-
|
|
7600
|
-
|
|
7601
|
-
found_sections = []
|
|
7602
|
-
for section in sections:
|
|
7603
|
-
if search.lower() in section.lower():
|
|
7604
|
-
found_sections.append(section)
|
|
7605
|
-
|
|
7606
|
-
if found_sections:
|
|
7607
|
-
# Also find specific lines with the search term
|
|
7608
|
-
all_lines = content.split('\n')
|
|
7609
|
-
matching_lines = []
|
|
7610
|
-
for i, line in enumerate(all_lines):
|
|
7611
|
-
if search.lower() in line.lower():
|
|
7612
|
-
# Get context (2 lines before and after)
|
|
7613
|
-
start = max(0, i - 2)
|
|
7614
|
-
end = min(len(all_lines), i + 3)
|
|
7615
|
-
context = '\n'.join(all_lines[start:end])
|
|
7616
|
-
if context not in matching_lines:
|
|
7617
|
-
matching_lines.append((i + 1, context))
|
|
7618
|
-
|
|
7619
|
-
# Show summary
|
|
7620
|
-
click.secho(f"Found in {len(found_sections)} section(s):", fg='green')
|
|
7621
|
-
for section in found_sections:
|
|
7622
|
-
# Extract section title
|
|
7623
|
-
title_match = re.match(r'^##\s+(.+)$', section, re.MULTILINE)
|
|
7624
|
-
if title_match:
|
|
7625
|
-
click.echo(f" - {title_match.group(1)}")
|
|
7597
|
+
# Split into subsections (### headers) for focused results
|
|
7598
|
+
subsections = re.split(r'(?=^### )', content, flags=re.MULTILINE)
|
|
7626
7599
|
|
|
7627
|
-
|
|
7600
|
+
# Also split into main sections (## headers)
|
|
7601
|
+
main_sections = re.split(r'(?=^## )', content, flags=re.MULTILINE)
|
|
7628
7602
|
|
|
7629
|
-
|
|
7630
|
-
|
|
7631
|
-
|
|
7603
|
+
# Find matching subsections (### level) - most focused
|
|
7604
|
+
matching_subsections = []
|
|
7605
|
+
for subsection in subsections:
|
|
7606
|
+
if search.lower() in subsection.lower():
|
|
7607
|
+
# Extract title
|
|
7608
|
+
title_match = re.match(r'^###\s+(.+)$', subsection, re.MULTILINE)
|
|
7609
|
+
if title_match:
|
|
7610
|
+
# Trim subsection to just the content until next ### or ##
|
|
7611
|
+
lines = subsection.split('\n')
|
|
7612
|
+
trimmed_lines = []
|
|
7613
|
+
for line in lines:
|
|
7614
|
+
if line.startswith('## ') and not line.startswith('### '):
|
|
7615
|
+
break
|
|
7616
|
+
trimmed_lines.append(line)
|
|
7617
|
+
matching_subsections.append((title_match.group(1), '\n'.join(trimmed_lines)))
|
|
7618
|
+
|
|
7619
|
+
if matching_subsections:
|
|
7620
|
+
click.secho(f"Found {len(matching_subsections)} matching subsection(s):", fg='green')
|
|
7621
|
+
click.echo()
|
|
7632
7622
|
|
|
7633
|
-
|
|
7634
|
-
|
|
7635
|
-
|
|
7623
|
+
# Show focused subsections (limit output)
|
|
7624
|
+
for title, sub_content in matching_subsections[:5]:
|
|
7625
|
+
click.secho(f"### {title}", fg='yellow', bold=True)
|
|
7626
|
+
# Highlight search term in content
|
|
7636
7627
|
highlighted = re.sub(
|
|
7637
7628
|
f'({re.escape(search)})',
|
|
7638
7629
|
click.style(r'\1', fg='green', bold=True),
|
|
7639
|
-
|
|
7630
|
+
sub_content,
|
|
7640
7631
|
flags=re.IGNORECASE
|
|
7641
7632
|
)
|
|
7642
|
-
|
|
7643
|
-
|
|
7644
|
-
|
|
7645
|
-
|
|
7646
|
-
|
|
7647
|
-
|
|
7648
|
-
|
|
7649
|
-
|
|
7650
|
-
|
|
7651
|
-
click.echo("(Scroll or pipe to a file for full content)")
|
|
7652
|
-
click.echo()
|
|
7653
|
-
|
|
7654
|
-
for section in found_sections:
|
|
7655
|
-
click.echo(section)
|
|
7633
|
+
# Limit lines per subsection
|
|
7634
|
+
lines = highlighted.split('\n')
|
|
7635
|
+
if len(lines) > 30:
|
|
7636
|
+
click.echo('\n'.join(lines[:30]))
|
|
7637
|
+
click.secho(f" ... ({len(lines) - 30} more lines)", fg='cyan')
|
|
7638
|
+
else:
|
|
7639
|
+
click.echo(highlighted)
|
|
7640
|
+
click.echo()
|
|
7641
|
+
click.secho("-" * 40, fg='cyan')
|
|
7656
7642
|
click.echo()
|
|
7657
7643
|
|
|
7644
|
+
if len(matching_subsections) > 5:
|
|
7645
|
+
click.secho(f"... and {len(matching_subsections) - 5} more subsections", fg='cyan')
|
|
7646
|
+
click.echo("Use --list to see all sections")
|
|
7658
7647
|
else:
|
|
7659
|
-
|
|
7660
|
-
|
|
7661
|
-
|
|
7662
|
-
|
|
7663
|
-
|
|
7664
|
-
|
|
7665
|
-
|
|
7666
|
-
|
|
7648
|
+
# Fall back to main section search (## level)
|
|
7649
|
+
found_sections = []
|
|
7650
|
+
for section in main_sections:
|
|
7651
|
+
if search.lower() in section.lower():
|
|
7652
|
+
title_match = re.match(r'^##\s+(.+)$', section, re.MULTILINE)
|
|
7653
|
+
if title_match:
|
|
7654
|
+
found_sections.append((title_match.group(1), section))
|
|
7655
|
+
|
|
7656
|
+
if found_sections:
|
|
7657
|
+
click.secho(f"Found in {len(found_sections)} section(s):", fg='green')
|
|
7658
|
+
for title, _ in found_sections:
|
|
7659
|
+
click.echo(f" - {title}")
|
|
7660
|
+
click.echo()
|
|
7661
|
+
|
|
7662
|
+
# Show first matching section, trimmed
|
|
7663
|
+
title, section = found_sections[0]
|
|
7664
|
+
click.secho(f"## {title}", fg='yellow', bold=True)
|
|
7665
|
+
highlighted = re.sub(
|
|
7666
|
+
f'({re.escape(search)})',
|
|
7667
|
+
click.style(r'\1', fg='green', bold=True),
|
|
7668
|
+
section,
|
|
7669
|
+
flags=re.IGNORECASE
|
|
7670
|
+
)
|
|
7671
|
+
lines = highlighted.split('\n')
|
|
7672
|
+
if len(lines) > 40:
|
|
7673
|
+
click.echo('\n'.join(lines[:40]))
|
|
7674
|
+
click.secho(f"\n... ({len(lines) - 40} more lines in this section)", fg='cyan')
|
|
7675
|
+
else:
|
|
7676
|
+
click.echo(highlighted)
|
|
7677
|
+
else:
|
|
7678
|
+
click.secho(f"No matches found for '{search}'", fg='yellow')
|
|
7679
|
+
click.echo()
|
|
7680
|
+
click.echo("Try searching for:")
|
|
7681
|
+
click.echo(" - Keywords: class, function, define, open, global, shuffled")
|
|
7682
|
+
click.echo(" - Syntax: $, @, ::, this->, <<==, <==, #$")
|
|
7683
|
+
click.echo(" - Types: string, int, stack, vector, map, json")
|
|
7684
|
+
click.echo()
|
|
7685
|
+
click.echo("Or use: includecpp cssl doc --list")
|
|
7667
7686
|
else:
|
|
7668
7687
|
# Full documentation mode
|
|
7669
7688
|
click.echo_via_pager(content)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# CSSL - C-Style Scripting Language
|
|
2
2
|
|
|
3
|
-
> Version 3.7.
|
|
3
|
+
> Version 3.7.6 | A modern scripting language with C++-style syntax and unique features like CodeInfusion and BruteInjection.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -41,22 +41,25 @@
|
|
|
41
41
|
```python
|
|
42
42
|
from includecpp import CSSL
|
|
43
43
|
|
|
44
|
-
#
|
|
45
|
-
CSSL.
|
|
46
|
-
|
|
47
|
-
# Execute code
|
|
48
|
-
CSSL.exec("""
|
|
44
|
+
# Execute code (v3.7.6+: use run() instead of exec())
|
|
45
|
+
CSSL.run("""
|
|
49
46
|
printl("Hello CSSL!");
|
|
50
47
|
""")
|
|
51
48
|
|
|
52
49
|
# With parameters and return value
|
|
53
|
-
result = CSSL.
|
|
50
|
+
result = CSSL.run("""
|
|
54
51
|
string name = parameter.get(0);
|
|
55
52
|
printl("Hello " + name);
|
|
56
53
|
parameter.return(true);
|
|
57
54
|
""", "World")
|
|
58
55
|
|
|
59
56
|
print(result) # True
|
|
57
|
+
|
|
58
|
+
# Create typed scripts and modules (v3.7.6+)
|
|
59
|
+
main = CSSL.script("cssl", '''printl("Main");''')
|
|
60
|
+
payload = CSSL.script("cssl-pl", '''void helper() { printl("Helper!"); }''')
|
|
61
|
+
mod = CSSL.makemodule(main, payload, "mymod")
|
|
62
|
+
mod.helper() # Call function directly
|
|
60
63
|
```
|
|
61
64
|
|
|
62
65
|
### CLI Execution
|
|
@@ -701,12 +704,24 @@ super void forceRun() {
|
|
|
701
704
|
|
|
702
705
|
### shuffled
|
|
703
706
|
|
|
704
|
-
Allows multiple return values.
|
|
707
|
+
Allows multiple return values with tuple unpacking.
|
|
705
708
|
|
|
706
709
|
```cssl
|
|
707
710
|
shuffled string getNames() {
|
|
708
711
|
return "Alice", "Bob", "Charlie";
|
|
709
712
|
}
|
|
713
|
+
|
|
714
|
+
// Tuple unpacking (v3.7.6+)
|
|
715
|
+
a, b, c = getNames();
|
|
716
|
+
printl(a); // "Alice"
|
|
717
|
+
printl(b); // "Bob"
|
|
718
|
+
printl(c); // "Charlie"
|
|
719
|
+
|
|
720
|
+
// Works with any types
|
|
721
|
+
shuffled getValues() {
|
|
722
|
+
return "text", 42, true;
|
|
723
|
+
}
|
|
724
|
+
name, num, flag = getValues();
|
|
710
725
|
```
|
|
711
726
|
|
|
712
727
|
---
|
|
@@ -1143,6 +1158,10 @@ print(stats.total) # 50 - Persisted!
|
|
|
1143
1158
|
|
|
1144
1159
|
CodeInfusion enables modifying functions at runtime.
|
|
1145
1160
|
|
|
1161
|
+
> **Important**: Injection operators must be written **without spaces**:
|
|
1162
|
+
> - ✓ `func() <<==` / `func() +<<==` / `func() -<<==` (correct)
|
|
1163
|
+
> - ✗ `func() < <==` / `func() + <<==` / `func() - <<==` (wrong)
|
|
1164
|
+
|
|
1146
1165
|
### <<== (Replace)
|
|
1147
1166
|
|
|
1148
1167
|
Replaces function content.
|
|
@@ -1629,23 +1629,42 @@ class CSSLParser:
|
|
|
1629
1629
|
return ASTNode('c_for_update', value={'var': var_name, 'op': 'none'})
|
|
1630
1630
|
|
|
1631
1631
|
def _parse_python_style_for(self) -> ASTNode:
|
|
1632
|
-
"""Parse Python-style for loop: for (i in range(...)) { }
|
|
1632
|
+
"""Parse Python-style for loop: for (i in range(...)) { } or for (item in collection) { }
|
|
1633
1633
|
|
|
1634
1634
|
Supports:
|
|
1635
1635
|
for (i in range(n)) { } - 0 to n-1
|
|
1636
1636
|
for (i in range(start, end)) { } - start to end-1
|
|
1637
1637
|
for (i in range(start, end, step)) { }
|
|
1638
|
+
for (item in collection) { } - iterate over list/vector
|
|
1639
|
+
for (item in @global_collection) { } - iterate over global
|
|
1638
1640
|
"""
|
|
1639
1641
|
var_name = self._advance().value
|
|
1640
1642
|
self._expect(TokenType.KEYWORD) # 'in'
|
|
1641
1643
|
|
|
1642
|
-
#
|
|
1644
|
+
# Check if this is range() or collection iteration
|
|
1645
|
+
is_range = False
|
|
1643
1646
|
if self._check(TokenType.KEYWORD) and self._peek().value == 'range':
|
|
1644
1647
|
self._advance() # consume 'range' keyword
|
|
1648
|
+
is_range = True
|
|
1645
1649
|
elif self._check(TokenType.IDENTIFIER) and self._peek().value == 'range':
|
|
1646
1650
|
self._advance() # consume 'range' identifier
|
|
1647
|
-
|
|
1648
|
-
|
|
1651
|
+
is_range = True
|
|
1652
|
+
|
|
1653
|
+
# If not range, parse as collection iteration
|
|
1654
|
+
if not is_range:
|
|
1655
|
+
iterable = self._parse_expression()
|
|
1656
|
+
self._expect(TokenType.PAREN_END)
|
|
1657
|
+
|
|
1658
|
+
node = ASTNode('foreach', value={'var': var_name, 'iterable': iterable}, children=[])
|
|
1659
|
+
self._expect(TokenType.BLOCK_START)
|
|
1660
|
+
|
|
1661
|
+
while not self._check(TokenType.BLOCK_END) and not self._is_at_end():
|
|
1662
|
+
stmt = self._parse_statement()
|
|
1663
|
+
if stmt:
|
|
1664
|
+
node.children.append(stmt)
|
|
1665
|
+
|
|
1666
|
+
self._expect(TokenType.BLOCK_END)
|
|
1667
|
+
return node
|
|
1649
1668
|
|
|
1650
1669
|
self._expect(TokenType.PAREN_START)
|
|
1651
1670
|
first_arg = self._parse_expression()
|
|
@@ -1757,11 +1776,31 @@ class CSSLParser:
|
|
|
1757
1776
|
return node
|
|
1758
1777
|
|
|
1759
1778
|
def _parse_return(self) -> ASTNode:
|
|
1760
|
-
|
|
1779
|
+
"""Parse return statement, supporting multiple values for shuffled functions.
|
|
1780
|
+
|
|
1781
|
+
Syntax:
|
|
1782
|
+
return; // Return None
|
|
1783
|
+
return value; // Return single value
|
|
1784
|
+
return a, b, c; // Return multiple values (for shuffled)
|
|
1785
|
+
"""
|
|
1786
|
+
values = []
|
|
1761
1787
|
if not self._check(TokenType.SEMICOLON) and not self._check(TokenType.BLOCK_END):
|
|
1762
|
-
|
|
1788
|
+
values.append(self._parse_expression())
|
|
1789
|
+
|
|
1790
|
+
# Check for comma-separated return values (shuffled return)
|
|
1791
|
+
while self._check(TokenType.COMMA):
|
|
1792
|
+
self._advance() # consume comma
|
|
1793
|
+
values.append(self._parse_expression())
|
|
1794
|
+
|
|
1763
1795
|
self._match(TokenType.SEMICOLON)
|
|
1764
|
-
|
|
1796
|
+
|
|
1797
|
+
if len(values) == 0:
|
|
1798
|
+
return ASTNode('return', value=None)
|
|
1799
|
+
elif len(values) == 1:
|
|
1800
|
+
return ASTNode('return', value=values[0])
|
|
1801
|
+
else:
|
|
1802
|
+
# Multiple return values - create tuple return
|
|
1803
|
+
return ASTNode('return', value={'multiple': True, 'values': values})
|
|
1765
1804
|
|
|
1766
1805
|
def _parse_super_function(self) -> ASTNode:
|
|
1767
1806
|
"""Parse super-function for .cssl-pl payload files.
|
|
@@ -1873,6 +1912,25 @@ class CSSLParser:
|
|
|
1873
1912
|
def _parse_expression_statement(self) -> Optional[ASTNode]:
|
|
1874
1913
|
expr = self._parse_expression()
|
|
1875
1914
|
|
|
1915
|
+
# === TUPLE UNPACKING: a, b, c = shuffled_func() ===
|
|
1916
|
+
# Check if we have comma-separated identifiers before =
|
|
1917
|
+
if expr.type == 'identifier' and self._check(TokenType.COMMA):
|
|
1918
|
+
targets = [expr]
|
|
1919
|
+
while self._match(TokenType.COMMA):
|
|
1920
|
+
next_expr = self._parse_expression()
|
|
1921
|
+
if next_expr.type == 'identifier':
|
|
1922
|
+
targets.append(next_expr)
|
|
1923
|
+
else:
|
|
1924
|
+
# Not a simple identifier list, this is something else
|
|
1925
|
+
# Restore and fall through to normal parsing
|
|
1926
|
+
break
|
|
1927
|
+
|
|
1928
|
+
# Check if followed by =
|
|
1929
|
+
if self._match(TokenType.EQUALS):
|
|
1930
|
+
value = self._parse_expression()
|
|
1931
|
+
self._match(TokenType.SEMICOLON)
|
|
1932
|
+
return ASTNode('tuple_assignment', value={'targets': targets, 'value': value})
|
|
1933
|
+
|
|
1876
1934
|
# === BASIC INJECTION: <== (replace target with source) ===
|
|
1877
1935
|
if self._match(TokenType.INJECT_LEFT):
|
|
1878
1936
|
# Check if this is a createcmd injection with a code block
|
|
@@ -963,10 +963,20 @@ class CSSLRuntime:
|
|
|
963
963
|
|
|
964
964
|
# Bind parameters - handle both positional and named arguments
|
|
965
965
|
for i, param in enumerate(params):
|
|
966
|
-
# Extract param name from dict format: {'name': 'a', 'type': 'int'}
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
966
|
+
# Extract param name and type from dict format: {'name': 'a', 'type': 'int'}
|
|
967
|
+
if isinstance(param, dict):
|
|
968
|
+
param_name = param['name']
|
|
969
|
+
param_type = param.get('type', '')
|
|
970
|
+
else:
|
|
971
|
+
param_name = param
|
|
972
|
+
param_type = ''
|
|
973
|
+
|
|
974
|
+
# Check if this is an 'open' parameter - receives all args as a list
|
|
975
|
+
if param_type == 'open' or param_name == 'Params':
|
|
976
|
+
# 'open Params' receives all arguments as a list
|
|
977
|
+
new_scope.set(param_name, list(args))
|
|
978
|
+
new_scope.set('Params', list(args)) # Also set 'Params' for OpenFind
|
|
979
|
+
elif param_name in kwargs:
|
|
970
980
|
# Named argument takes priority
|
|
971
981
|
new_scope.set(param_name, kwargs[param_name])
|
|
972
982
|
elif i < len(args):
|
|
@@ -1176,8 +1186,20 @@ class CSSLRuntime:
|
|
|
1176
1186
|
return None
|
|
1177
1187
|
|
|
1178
1188
|
def _exec_return(self, node: ASTNode) -> Any:
|
|
1179
|
-
"""Execute return statement
|
|
1180
|
-
|
|
1189
|
+
"""Execute return statement.
|
|
1190
|
+
|
|
1191
|
+
Supports multiple return values for shuffled functions:
|
|
1192
|
+
return a, b, c; // Returns tuple (a, b, c)
|
|
1193
|
+
"""
|
|
1194
|
+
if node.value is None:
|
|
1195
|
+
raise CSSLReturn(None)
|
|
1196
|
+
|
|
1197
|
+
# Check if this is a multiple return value
|
|
1198
|
+
if isinstance(node.value, dict) and node.value.get('multiple'):
|
|
1199
|
+
values = [self._evaluate(v) for v in node.value.get('values', [])]
|
|
1200
|
+
raise CSSLReturn(tuple(values))
|
|
1201
|
+
|
|
1202
|
+
value = self._evaluate(node.value)
|
|
1181
1203
|
raise CSSLReturn(value)
|
|
1182
1204
|
|
|
1183
1205
|
def _exec_break(self, node: ASTNode) -> Any:
|
|
@@ -1804,6 +1826,36 @@ class CSSLRuntime:
|
|
|
1804
1826
|
|
|
1805
1827
|
return value
|
|
1806
1828
|
|
|
1829
|
+
def _exec_tuple_assignment(self, node: ASTNode) -> Any:
|
|
1830
|
+
"""Execute tuple unpacking assignment: a, b, c = shuffled_func()
|
|
1831
|
+
|
|
1832
|
+
Used with shuffled functions that return multiple values.
|
|
1833
|
+
"""
|
|
1834
|
+
targets = node.value.get('targets', [])
|
|
1835
|
+
value = self._evaluate(node.value.get('value'))
|
|
1836
|
+
|
|
1837
|
+
# Convert value to list if it's a tuple or iterable
|
|
1838
|
+
if isinstance(value, (list, tuple)):
|
|
1839
|
+
values = list(value)
|
|
1840
|
+
elif hasattr(value, '__iter__') and not isinstance(value, (str, dict)):
|
|
1841
|
+
values = list(value)
|
|
1842
|
+
else:
|
|
1843
|
+
# Single value - assign to first target only
|
|
1844
|
+
values = [value]
|
|
1845
|
+
|
|
1846
|
+
# Assign values to targets
|
|
1847
|
+
for i, target in enumerate(targets):
|
|
1848
|
+
if i < len(values):
|
|
1849
|
+
var_name = target.value if isinstance(target, ASTNode) else target
|
|
1850
|
+
self.scope.set(var_name, values[i])
|
|
1851
|
+
else:
|
|
1852
|
+
# More targets than values - set to None
|
|
1853
|
+
var_name = target.value if isinstance(target, ASTNode) else target
|
|
1854
|
+
self.scope.set(var_name, None)
|
|
1855
|
+
|
|
1856
|
+
# Assignment statements don't produce a visible result
|
|
1857
|
+
return None
|
|
1858
|
+
|
|
1807
1859
|
def _exec_expression(self, node: ASTNode) -> Any:
|
|
1808
1860
|
"""Execute expression statement"""
|
|
1809
1861
|
return self._evaluate(node.value)
|
|
@@ -6,14 +6,12 @@
|
|
|
6
6
|
"brackets": [
|
|
7
7
|
["{", "}"],
|
|
8
8
|
["[", "]"],
|
|
9
|
-
["(", ")"]
|
|
10
|
-
["<", ">"]
|
|
9
|
+
["(", ")"]
|
|
11
10
|
],
|
|
12
11
|
"autoClosingPairs": [
|
|
13
12
|
{ "open": "{", "close": "}" },
|
|
14
13
|
{ "open": "[", "close": "]" },
|
|
15
14
|
{ "open": "(", "close": ")" },
|
|
16
|
-
{ "open": "<", "close": ">" },
|
|
17
15
|
{ "open": "\"", "close": "\"", "notIn": ["string"] },
|
|
18
16
|
{ "open": "'", "close": "'", "notIn": ["string", "comment"] }
|
|
19
17
|
],
|
|
@@ -21,7 +19,6 @@
|
|
|
21
19
|
["{", "}"],
|
|
22
20
|
["[", "]"],
|
|
23
21
|
["(", ")"],
|
|
24
|
-
["<", ">"],
|
|
25
22
|
["\"", "\""],
|
|
26
23
|
["'", "'"]
|
|
27
24
|
],
|
|
@@ -3,15 +3,18 @@
|
|
|
3
3
|
"name": "CSSL",
|
|
4
4
|
"scopeName": "source.cssl",
|
|
5
5
|
"patterns": [
|
|
6
|
+
{ "include": "#super-functions" },
|
|
6
7
|
{ "include": "#comments" },
|
|
7
8
|
{ "include": "#strings" },
|
|
8
9
|
{ "include": "#numbers" },
|
|
9
10
|
{ "include": "#class-definition" },
|
|
11
|
+
{ "include": "#sql-types" },
|
|
10
12
|
{ "include": "#keywords" },
|
|
11
13
|
{ "include": "#types" },
|
|
12
14
|
{ "include": "#function-modifiers" },
|
|
13
15
|
{ "include": "#injection-operators" },
|
|
14
16
|
{ "include": "#namespace-functions" },
|
|
17
|
+
{ "include": "#iterator-methods" },
|
|
15
18
|
{ "include": "#filter-helpers" },
|
|
16
19
|
{ "include": "#this-access" },
|
|
17
20
|
{ "include": "#captured-references" },
|
|
@@ -19,12 +22,26 @@
|
|
|
19
22
|
{ "include": "#shared-references" },
|
|
20
23
|
{ "include": "#instance-references" },
|
|
21
24
|
{ "include": "#module-references" },
|
|
25
|
+
{ "include": "#reference-operator" },
|
|
26
|
+
{ "include": "#method-calls" },
|
|
22
27
|
{ "include": "#function-calls" },
|
|
23
28
|
{ "include": "#builtins" },
|
|
24
29
|
{ "include": "#operators" },
|
|
25
30
|
{ "include": "#constants" }
|
|
26
31
|
],
|
|
27
32
|
"repository": {
|
|
33
|
+
"super-functions": {
|
|
34
|
+
"patterns": [
|
|
35
|
+
{
|
|
36
|
+
"name": "markup.bold.super.builtin.cssl",
|
|
37
|
+
"match": "#\\$(run|exec|printl|init)\\b"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"name": "markup.bold.super.call.cssl",
|
|
41
|
+
"match": "#\\$[a-zA-Z_][a-zA-Z0-9_]*"
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
},
|
|
28
45
|
"comments": {
|
|
29
46
|
"patterns": [
|
|
30
47
|
{
|
|
@@ -49,6 +66,10 @@
|
|
|
49
66
|
"name": "constant.character.escape.cssl",
|
|
50
67
|
"match": "\\\\."
|
|
51
68
|
},
|
|
69
|
+
{
|
|
70
|
+
"name": "variable.other.interpolated.fstring.cssl",
|
|
71
|
+
"match": "\\{[a-zA-Z_][a-zA-Z0-9_]*\\}"
|
|
72
|
+
},
|
|
52
73
|
{
|
|
53
74
|
"name": "variable.other.interpolated.cssl",
|
|
54
75
|
"match": "<[a-zA-Z_][a-zA-Z0-9_]*>"
|
|
@@ -118,6 +139,18 @@
|
|
|
118
139
|
}
|
|
119
140
|
]
|
|
120
141
|
},
|
|
142
|
+
"sql-types": {
|
|
143
|
+
"patterns": [
|
|
144
|
+
{
|
|
145
|
+
"name": "support.type.sql.table.cssl",
|
|
146
|
+
"match": "\\bsql::table::(space|Section|limited|protected)\\b"
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"name": "support.type.sql.cssl",
|
|
150
|
+
"match": "\\bsql::(table|data|data__list|sync|db)\\b"
|
|
151
|
+
}
|
|
152
|
+
]
|
|
153
|
+
},
|
|
121
154
|
"keywords": {
|
|
122
155
|
"patterns": [
|
|
123
156
|
{
|
|
@@ -130,7 +163,7 @@
|
|
|
130
163
|
},
|
|
131
164
|
{
|
|
132
165
|
"name": "keyword.other.cssl",
|
|
133
|
-
"match": "\\b(service-init|service-run|service-include|struct|structure|define|main|package|package-includes|exec|as|global|include|get|payload)\\b"
|
|
166
|
+
"match": "\\b(service-init|service-run|service-include|struct|structure|define|main|package|package-includes|exec|as|global|include|get|payload|convert)\\b"
|
|
134
167
|
},
|
|
135
168
|
{
|
|
136
169
|
"name": "keyword.operator.logical.cssl",
|
|
@@ -146,18 +179,26 @@
|
|
|
146
179
|
"patterns": [
|
|
147
180
|
{
|
|
148
181
|
"name": "storage.type.primitive.cssl",
|
|
149
|
-
"match": "\\b(int|string|float|bool|void|json|dynamic)\\b"
|
|
182
|
+
"match": "\\b(int|string|float|bool|void|json|dynamic|auto|long|double)\\b"
|
|
150
183
|
},
|
|
151
184
|
{
|
|
152
185
|
"name": "storage.type.container.cssl",
|
|
153
|
-
"match": "\\b(array|vector|stack|list|dictionary|dict|map|datastruct|dataspace|shuffled|iterator|combo|openquote|instance)\\b"
|
|
186
|
+
"match": "\\b(array|vector|stack|list|dictionary|dict|map|datastruct|dataspace|shuffled|iterator|combo|openquote|instance|tuple|set|queue)\\b"
|
|
154
187
|
},
|
|
155
188
|
{
|
|
156
189
|
"name": "storage.type.generic.cssl",
|
|
157
|
-
"match": "\\b(array|vector|stack|list|dictionary|dict|map|datastruct|dataspace|shuffled|iterator|combo|openquote|instance)\\s*<",
|
|
190
|
+
"match": "\\b(array|vector|stack|list|dictionary|dict|map|datastruct|dataspace|shuffled|iterator|combo|openquote|instance|tuple|set|queue)\\s*<",
|
|
158
191
|
"captures": {
|
|
159
192
|
"1": { "name": "storage.type.container.cssl" }
|
|
160
193
|
}
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"name": "storage.type.map-literal.cssl",
|
|
197
|
+
"match": "\\bmap\\s*<[^>]+>\\s*\\{"
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"name": "storage.type.combo-open.cssl",
|
|
201
|
+
"match": "\\bcombo\\s*<\\s*open\\s*&"
|
|
161
202
|
}
|
|
162
203
|
]
|
|
163
204
|
},
|
|
@@ -165,19 +206,27 @@
|
|
|
165
206
|
"patterns": [
|
|
166
207
|
{
|
|
167
208
|
"name": "storage.modifier.cssl",
|
|
168
|
-
"match": "\\b(undefined|open|closed|private|virtual|meta|super|sqlbased)\\b"
|
|
209
|
+
"match": "\\b(undefined|open|closed|private|virtual|meta|super|sqlbased|protected|limited)\\b"
|
|
169
210
|
}
|
|
170
211
|
]
|
|
171
212
|
},
|
|
172
213
|
"injection-operators": {
|
|
173
214
|
"patterns": [
|
|
174
215
|
{
|
|
175
|
-
"name": "
|
|
176
|
-
"match": "(
|
|
216
|
+
"name": "entity.name.tag.infuse.cssl",
|
|
217
|
+
"match": "(\\+<<==|<<==|-<<==)"
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
"name": "entity.name.tag.infuse.out.cssl",
|
|
221
|
+
"match": "(==>>\\+|==>>|-==>>)"
|
|
177
222
|
},
|
|
178
223
|
{
|
|
179
224
|
"name": "keyword.operator.injection.brute.cssl",
|
|
180
|
-
"match": "(
|
|
225
|
+
"match": "(\\+<==|<==|-<==)"
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
"name": "keyword.operator.injection.brute.out.cssl",
|
|
229
|
+
"match": "(==>\\+|==>|-==>)"
|
|
181
230
|
},
|
|
182
231
|
{
|
|
183
232
|
"name": "keyword.operator.flow.cssl",
|
|
@@ -189,7 +238,7 @@
|
|
|
189
238
|
"patterns": [
|
|
190
239
|
{
|
|
191
240
|
"name": "support.function.namespace.json.cssl",
|
|
192
|
-
"match": "\\bjson::(read|write|parse|stringify|pretty|get|set|has|keys|values|merge)\\b"
|
|
241
|
+
"match": "\\bjson::(read|write|parse|stringify|pretty|get|set|has|keys|values|merge|key|value)\\b"
|
|
193
242
|
},
|
|
194
243
|
{
|
|
195
244
|
"name": "support.function.namespace.instance.cssl",
|
|
@@ -198,6 +247,26 @@
|
|
|
198
247
|
{
|
|
199
248
|
"name": "support.function.namespace.string.cssl",
|
|
200
249
|
"match": "\\bstring::(where|contains|not|startsWith|endsWith|length|lenght|cut|cutAfter|value)\\b"
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"name": "support.function.namespace.sql.cssl",
|
|
253
|
+
"match": "\\bsql::(connect|load|save|update|sync|Structured)\\b"
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
"name": "support.function.namespace.combo.cssl",
|
|
257
|
+
"match": "\\bcombo::(filterdb|blocked|like)\\b"
|
|
258
|
+
}
|
|
259
|
+
]
|
|
260
|
+
},
|
|
261
|
+
"iterator-methods": {
|
|
262
|
+
"patterns": [
|
|
263
|
+
{
|
|
264
|
+
"name": "support.function.iterator.cssl",
|
|
265
|
+
"match": "::iterator::(set|move|insert|pop|task|dtask|read|write)\\b"
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
"name": "support.function.like.cssl",
|
|
269
|
+
"match": "::like\\s*="
|
|
201
270
|
}
|
|
202
271
|
]
|
|
203
272
|
},
|
|
@@ -205,7 +274,7 @@
|
|
|
205
274
|
"patterns": [
|
|
206
275
|
{
|
|
207
276
|
"name": "support.function.filter.cssl",
|
|
208
|
-
"match": "\\
|
|
277
|
+
"match": "\\[(string|integer|json|array|vector|combo|dynamic|sql)::(where|contains|not|startsWith|endsWith|length|lenght|key|value|index|filterdb|blocked|data)\\s*=?"
|
|
209
278
|
}
|
|
210
279
|
]
|
|
211
280
|
},
|
|
@@ -269,6 +338,22 @@
|
|
|
269
338
|
}
|
|
270
339
|
]
|
|
271
340
|
},
|
|
341
|
+
"reference-operator": {
|
|
342
|
+
"patterns": [
|
|
343
|
+
{
|
|
344
|
+
"name": "keyword.operator.reference.cssl",
|
|
345
|
+
"match": "&(?=[a-zA-Z_@])"
|
|
346
|
+
}
|
|
347
|
+
]
|
|
348
|
+
},
|
|
349
|
+
"method-calls": {
|
|
350
|
+
"patterns": [
|
|
351
|
+
{
|
|
352
|
+
"name": "support.function.method.cssl",
|
|
353
|
+
"match": "\\.(push_back|append|insert|fill|at|is|read|write|content|save|where|load|update|oqt|connect|Structured|create|Queue|sync|pop|end|get|set|has|keys|values|convert)\\b"
|
|
354
|
+
}
|
|
355
|
+
]
|
|
356
|
+
},
|
|
272
357
|
"function-calls": {
|
|
273
358
|
"patterns": [
|
|
274
359
|
{
|
|
@@ -293,7 +378,7 @@
|
|
|
293
378
|
},
|
|
294
379
|
{
|
|
295
380
|
"name": "support.function.builtin.special.cssl",
|
|
296
|
-
"match": "\\b(OpenFind|share|shared)\\b"
|
|
381
|
+
"match": "\\b(OpenFind|share|shared|include)\\b"
|
|
297
382
|
},
|
|
298
383
|
{
|
|
299
384
|
"name": "support.variable.builtin.parameter.cssl",
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
includecpp/__init__.py,sha256=
|
|
1
|
+
includecpp/__init__.py,sha256=B6a0CroJHkuHfRN0gAFLyQZaafrI8Wb8pysFveVSTas,1672
|
|
2
2
|
includecpp/__init__.pyi,sha256=c4gZW7_XQXcp6FBcTi5W7zXTmCtbgQhlC4cyeVqtRRM,7253
|
|
3
3
|
includecpp/__main__.py,sha256=d6QK0PkvUe1ENofpmHRAg3bwNbZr8PiRscfI3-WRfVg,72
|
|
4
4
|
includecpp/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
5
|
includecpp/cli/__init__.py,sha256=Yda-4a5QJb_tKu35YQNfc5lu-LewTsM5abqNNkzS47M,113
|
|
6
|
-
includecpp/cli/commands.py,sha256
|
|
6
|
+
includecpp/cli/commands.py,sha256=9PAYEMbixk2EvorcwZunSRJbyAdPSzt67NsVM5qdjLQ,346027
|
|
7
7
|
includecpp/cli/config_parser.py,sha256=KveeYUg2TA9sC5hKVzYYfgdNm2WfLG5y7_yxgBWn9yM,4886
|
|
8
8
|
includecpp/core/__init__.py,sha256=L1bT6oikTjdto-6Px7DpjePtM07ymo3Bnov1saZzsGg,390
|
|
9
9
|
includecpp/core/ai_integration.py,sha256=PW6yFDqdXjfchpfKTKg59AOLhLry9kqJEGf_65BztrY,87603
|
|
@@ -19,14 +19,14 @@ includecpp/core/exceptions.py,sha256=szeF4qdzi_q8hBBZi7mJxkliyQ0crplkLYe0ymlBGtk
|
|
|
19
19
|
includecpp/core/path_discovery.py,sha256=jI0oSq6Hsd4LKXmU4dOiGSrXcEO_KWMXfQ5_ylBmXvU,2561
|
|
20
20
|
includecpp/core/project_ui.py,sha256=la2EQZKmUkJGuJxnbs09hH1ZhBh9bfndo6okzZsk2dQ,141134
|
|
21
21
|
includecpp/core/settings_ui.py,sha256=B2SlwgdplF2KiBk5UYf2l8Jjifjd0F-FmBP0DPsVCEQ,11798
|
|
22
|
-
includecpp/core/cssl/CSSL_DOCUMENTATION.md,sha256=
|
|
22
|
+
includecpp/core/cssl/CSSL_DOCUMENTATION.md,sha256=47sUPO-FMq_8_CrJBZFoFBgSO3gSi5zoB1Xp7oeifho,40773
|
|
23
23
|
includecpp/core/cssl/__init__.py,sha256=TYRlyheTw5OYkkmUxJYpAjyyQShu6NF4igYZYE76eR0,1811
|
|
24
24
|
includecpp/core/cssl/cssl_builtins.py,sha256=MJtWF7PeWkasxxkpN2zaCjeIJoQw5BPy-jQNYberMQo,85010
|
|
25
25
|
includecpp/core/cssl/cssl_builtins.pyi,sha256=Zc__PCO9FDaTPPG92zgK6_QoeMohbs0xlv6YGPubEdQ,31010
|
|
26
26
|
includecpp/core/cssl/cssl_events.py,sha256=nupIcXW_Vjdud7zCU6hdwkQRQ0MujlPM7Tk2u7eDAiY,21013
|
|
27
27
|
includecpp/core/cssl/cssl_modules.py,sha256=cUg0-zdymMnWWTsA_BUrW5dx4R04dHpKcUhm-Wfiwwo,103006
|
|
28
|
-
includecpp/core/cssl/cssl_parser.py,sha256=
|
|
29
|
-
includecpp/core/cssl/cssl_runtime.py,sha256=
|
|
28
|
+
includecpp/core/cssl/cssl_parser.py,sha256=pOWe6kle4EvXLai3DNHfLcYGeb568EQ8upxscVVR5m0,113161
|
|
29
|
+
includecpp/core/cssl/cssl_runtime.py,sha256=3b14wEWvLpFDVA0r0pyNqy02l7s9FTdXQd61BdpPlZg,131780
|
|
30
30
|
includecpp/core/cssl/cssl_syntax.py,sha256=vgI-dgj6gs9cOHwNRff6JbwZZYW_fYutnwCkznlgZiE,17006
|
|
31
31
|
includecpp/core/cssl/cssl_types.py,sha256=XftmkvjxL-mKMz6HiTtnruG6P7haM21gFm7P9Caovug,48213
|
|
32
32
|
includecpp/generator/__init__.py,sha256=Rsy41bwimaEloD3gDRR_znPfIJzIsCFuWZgCTJBLJlc,62
|
|
@@ -37,13 +37,13 @@ includecpp/generator/type_resolver.h,sha256=ZsaxQqcCcKJJApYn7KOp2dLlQ1VFVG_oZDja
|
|
|
37
37
|
includecpp/templates/cpp.proj.template,sha256=Iy-L8I4Cl3tIgBMx1Qp5h6gURvkqOAqyodVHuDJ0Luw,359
|
|
38
38
|
includecpp/vscode/__init__.py,sha256=yLKw-_7MTX1Rx3jLk5JjharJQfFXbwtZVE7YqHpM7yg,39
|
|
39
39
|
includecpp/vscode/cssl/__init__.py,sha256=rQJAx5X05v-mAwqX1Qb-rbZO219iR73MziFNRUCNUIo,31
|
|
40
|
-
includecpp/vscode/cssl/language-configuration.json,sha256=
|
|
40
|
+
includecpp/vscode/cssl/language-configuration.json,sha256=61Q00cKI9may5L8YpxMmvfo6PAc-abdJqApfR85DWuw,904
|
|
41
41
|
includecpp/vscode/cssl/package.json,sha256=MWWIRLUnGvadWzEyfWdykUZHTsrG18sqpn5US5sXqac,1435
|
|
42
42
|
includecpp/vscode/cssl/snippets/cssl.snippets.json,sha256=l4SCEPR3CsPxA8HIVLKYY__I979TfKzYWtH1KYIsboo,33062
|
|
43
|
-
includecpp/vscode/cssl/syntaxes/cssl.tmLanguage.json,sha256=
|
|
44
|
-
includecpp-3.7.
|
|
45
|
-
includecpp-3.7.
|
|
46
|
-
includecpp-3.7.
|
|
47
|
-
includecpp-3.7.
|
|
48
|
-
includecpp-3.7.
|
|
49
|
-
includecpp-3.7.
|
|
43
|
+
includecpp/vscode/cssl/syntaxes/cssl.tmLanguage.json,sha256=t_AjAgZl16ugNhuU-OlIb4Q6SCOLsnQ3DPK2R0xotGk,16091
|
|
44
|
+
includecpp-3.7.6.dist-info/licenses/LICENSE,sha256=fWCsGGsiWZir0UzDd20Hh-3wtRyk1zqUntvtVuAWhvc,1093
|
|
45
|
+
includecpp-3.7.6.dist-info/METADATA,sha256=4GXuFRMpXcGjvxCEL0TvzbKDdW6bNUQHDJYh9bLQcao,32122
|
|
46
|
+
includecpp-3.7.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
47
|
+
includecpp-3.7.6.dist-info/entry_points.txt,sha256=6A5Mif9gi0139Bf03W5plAb3wnAgbNaEVe1HJoGE-2o,59
|
|
48
|
+
includecpp-3.7.6.dist-info/top_level.txt,sha256=RFUaR1KG-M6mCYwP6w4ydP5Cgc8yNbP78jxGAvyjMa8,11
|
|
49
|
+
includecpp-3.7.6.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|