Skip to content

Latest commit

 

History

History

rules

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Rules

Documentation for all diagnostics sent back to the client.

Warnings

Error message: Unused name

Flags variables that are declared but not used within the code.

const pi = 3.14;
display(5*5*3.14);

The variable pi should have a warning.

Errors

Error message: Missing semicolon

Identifies statements that are missing semicolons.

const x = 1

The line ending should have an error.

Error message: Trailing comma

Identifies expressions that have trailing commas.

const x = [1,2,3,];

The comma after 3 should have an error.

Error message: Only normal imports are allowed

Bans namespace and default imports.

import * as rune from "rune";
import black from "rune";

Both lines will throw an error around the identifier.

Error message: Unexpected token

Only allows identifiers as function parameters

function foo(a+b) {}

a+b will throw an error.

Error message: Identifier '${name}' has already been declared

Bans redeclaration of names in the same scope

let x = 1;
let x = 2;

The second x will throw an error.

Error message: Array expressions are not allowed

Bans array expressions before Source 3

const x = [1,2,3];

The array [1,2,3]; will throw an error.

Error message: No holes are allowed in array literals

Bans empty elements in array expressions

[1,,3];

The array [1,,3] will throw an error.

Error message: Cannot assign new value to constant ${name}

Bans reassignment to constant variable

const x = 1;
x = 2;

The second x will throw an error

Error message: Incomplete binary expression

Detects when a binary expression is missing a left/right node

10 + ;
5 === ;

Both lines will throw an error

Error message: Use ===/!== instead of ==/!=

Bans the use of loose equality checks == and !=

true == 1;

Error message: ${operator} is not allowed

Only permitted operators defined in Source is allowed. Binary operators like ^ or instanceof is banned, unary operators like typeof is also banned.

100^5;
typeof 1 === "number";

The two expressions will throw an error.

Error message: Expected string or number on left/right hand side of operation, got ${type}

Before Source 3, only strings or numbers can be in equality checks

true === 1; // Expected string or number on left hand side of operation, got boolean
true === (1 === 1); // Expected string or number on left hand side of operation, got boolean
(1 === 1) === undefined; // Expected string or number on right hand side of operation, got undefined
"string" === 1; // Expected string on left hand side of operation, got number

Errors are shown in the comments.

Error message: Break statements are not allowed;

No break statements before Source 3

break;

break will throw an error.

Error message: ${name} is not a function

Cannot call identifiers that are not a function

const x = 1;
x();
let y = 1;
y();

The function application on x will throw an error, however the function application on y will not, as y can be reassigned, hence it will be a runtime error.

Error message: Expected ${num_args} or more arguments, but got ${num_supplied_args}

Detects when a function application has not enough parameters. Currently does not work for anonymous lambdas.

display();

The call to display needs at least 1 element.

Error message: Incomplete ternary

Detects when a ternary does not have a consequent or alternate case.

b => b ? 1;

b ? 1 throws an error, as there is no alternate case.

Error message: Continue statements are not allowed

Bans continue statements before Source 3

continue;

continue will throw an error.

Error message: For statements are not allowed

Bans for statements before Source 3

for(let i = 0; i < 10; i++) {}

for(...) will throw an error.

Error message: Missing curly braces around for/while/if/else

Detects missing curly braces for some statements

if (1 === 1)
  display("1 is equal to 1");

The whole expression will throw an error.

Error message: Incomplete for loop

Detects if a for loop is missing any parts

for (let i = 0; i < 10;) {
}

for(...) will throw an error.

Error message: Missing function name

Detects if function declaration is incomplete

function () {}

The whole expression will throw an error.

Error message: No params allowed after rest element

If a function has a rest parameter, it must be the last parameter.

function foo(arg1, ...arg2, arg3) {}
(arg1, ...arg2, arg3) => {};

Both cases will throw an error around arg3

Error message: Name ${name} not declared

Detects if there is a declaration for an identifier in its scope.

{
  const x = 1;
  {
    display(x);
  }
}
display(x);

The first x in display(x) should not throw an error, but the second one should.

Error message: Missing "else" in "if-else" statement

else case is required in an if statement before Source 3

if (true) {
  display("hello world");
}

An error will be thrown around the body of the if statement.

Error message: Expected module name

Imports require the module name.

import { black }

An error will be thrown around the whole import statement.

Error message: Incomplete string expression

Strings must be closed within the same line

"hello world
";

An error will be thrown on both lines.

Error message: Null literals are not allowed

Nulls are not allowed in Source 1.

display(null);

An error will be thrown around null.

Error message: Member access expressions are not allowed

Member access with square brackets [] is not allowed before source 3.

"hello world"[0];

An error will be thrown around the whole expression.

Error message: No dot abbreviations

Source prohibits usage of dot access in any case.

display("hello world".length);

An error will be thrown around the whole expression.

Error message: Expected integer as array index, got ${type}

Array access must use non negative integers

const arr = [1,2,3];
arr[undefined]; // Expected non negative integer as array index, got undefined.
arr["test"]; // Expected non negative integer as array index, got string.
arr[1.1]; // Expected non negative integer as array index, got float.
arr[-1]; // Expected non negative integer as array index, got negative number.

Errors are shown in the comments.

Error message: Missing value in return statement

Returns statements must return a value in Source.

function foo() {
  return;
}

An error will be thrown around the return statement.

Error message: Spread syntax is only allowed when supplying arguments to a function

The spread syntax ... can only be used directly inside a function call as a parameter.

const x = [1,2,3];
display(list(...x)); // Valid
display(list((...x)); // Not valid

The second use of the spread syntax will throw an error.

Error message: Expressions not allowed in template literal

In Source, template literals are only used for multiline string, they cannot contain expressions.

const x = `10 * 10 = ${10*10}`

The expression 10*10 will throw an error.

Error message: Multiple declarations not allowed

In Source, only 1 declaration is allowed in each variable declarator.

const x = 1, y = 2, z = 3;

The whole statement will throw an error.

Error message: Incomplete variable declaration

Detects whether left and right side of variable declaration in present;

const x;

The whole statement will throw an error.

Error message: Use keyword "const" instead to declare a constant

Before Source 3, variables can only be declared with const

let x = 1;

The whole statement will throw an error.

Error message: While statements are not allowed

Before Source 3, while statements are not allowed.

while(true) {
  display("hi")
}

while(...) will throw an error.